2012-07-09 64 views
4

我只有NSUbiquitousKeyValueStore出現問題,並且無法在兩臺設備間可靠同步。它開始讓我發瘋。狂。NSUbiquitousKeyValueStore同步問題

我看我的代碼,請調用:

[[NSUbiquitousKeyValueStore defaultStore] setObject:_someData forKey:@"SomeData"]; 
[[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

但更多的時間比不,該數據一直沒有出現在其他設備上。

我已經看到它在幾秒鐘內同步,其他時間我已經等了一個小時,從未見過同步。我將設備插入xcode並開始調試,有時數據會突然彈出,有時則不會。有時候確實如此。

完成此調用後,退出並重新啓動應用程序,如果我閱讀它,則會看到舊數據,而不是我剛剛發佈的新數據。在同一臺設備上。

,當應用程序啓動時,我做出了一個電話:

_someData = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:@"SomeData"]; 

我假設有一個需要運行沒有初始化代碼。沒有我找到的例子。

當它工作時,它工作得很好。

然後今晚我一直在尋找的設備日誌,發現我的最後一個出口後,這一權利(並嘗試發送數據):

Jul 8 21:32:03 unknown syncdefaultsd[17296] <Warning>: Error writing storage for com.mycompany.myapp to /private/var/mobile/Applications/4AC8C56E-6060-408B-84F9-F7EC336221D9/Library/SyncedPreferences/com.mycompany.myapp.plist: Error Domain=NSCocoaErrorDomain Code=4 "The operation couldn’t be completed. (Cocoa error 4.)" UserInfo=0xde80d40 {NSFilePath=/private/var/mobile/Applications/4AC8C56E-6060-408B-84F9-F7EC336221D9/Library/SyncedPreferences, NSUnderlyingError=0xde80b20"The operation couldn’t becompleted. No such file or directory"} 

這條道路不是從我的應用程序沙箱(錯誤GUID的有效途徑),所以我想知道這是否是我的問題的根源。我在開發過程中會刪除並重新安裝應用程序,因此我不知道是否有某個舊路徑緩存在某處,並且正試圖同步這些數據。有沒有辦法清除它?

我知道我的所有權利都設置正確,因爲它有時會工作。

[[NSUbiquitousKeyValueStore defaultStore] synchronize]正在返回YES

有沒有其他人看過這個問題或那個錯誤?當我的應用程序啓動並將數據發送到雲時,是否還有其他需要做的事情?根據文檔和示例,它看起來很容易。

+0

我面臨同樣的問題,這讓我瘋狂!只是試圖找出爲什麼它不同步。 – 2012-08-04 04:46:38

+0

我有完全相同的問題。我發現刪除應用程序的容器常常導致問題浮出水面。一旦應用程序的兩個實例都有一個有效的容器,它們將正確同步。一旦嘗試通過刪除容器來測試「第一次體驗」,應用程序實例可能永遠不會從icloud獲取UBKV。我還沒有弄清楚這是否會在現實世界中出現。 – 2012-11-29 22:23:45

+0

這就是我所看到的。如果用戶從設備中刪除了應用程序,然後再次重新安裝,期望從雲UBKV獲取他們的數據,這種情況不會出現嗎?在我的情況下(一場比賽),這是我想處理的一個案例。 – 2012-11-30 02:21:29

回答

0

它可能是設備已安裝應用程序列表中的陳舊緩存。嘗試刪除設備上的應用並重新安裝。或者也許重新啓動設備。

一個肯定的是,你應該提交一份報告,以bugreport.apple.com

0

檢查設備控制檯[通過在Xcode組織者。它可能包含有用的信息。即使空的defaultStore同步返回YES,您的權利也可能不正確。

0

在這種情況下,如果您使用越獄設備,您必須在icloud和GameCenter支持正常工作之前刪除AppSync。很明顯,我假設你有Apple開發者賬戶。

0

我在啓動時使用它,並立即獲取iCloud值或updateKVStoreItems:在< 5秒鐘內獲得調用。

- (void) initializeiCloud 
{ 
    NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(updateKVStoreItems:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:store]; 
    if ([store boolForKey:@"fakeSyncBit"]) 
    { 
     NSLog(@"in initiCloud setting syncbit NO"); 
     [store setBool:NO forKey:@"fakeSyncBit"]; 
    } 
    else 
    { 
     NSLog(@"in initiCloud setting syncbit YES"); 
     [store setBool:YES forKey:@"fakeSyncBit"]; 
    } 
    [store synchronize]; 
    NSLog(@"icloud store is synchronized. updateKVStoreItems: should be called shortly"); 
} 
2

iCloud鍵值存儲不適用於需要定期頻繁同步的數據,並且Apple似乎並不保證這些操作的及時性。 Apple states

鍵值存儲區旨在用於存儲不經常更改的數據。如果設備上的應用程序頻繁更改鍵值存儲區,則系統可能會推遲一些更改的同步,以儘量減少往返服務器的次數。越頻繁的應用程序進行更改,越有可能後續更改將被延遲,並且不會立即顯示在其他設備上。

如果它是好的,你的應用程序不立即同步和你的這種興趣是加速測試/調試那麼看來這將是,除非你改變你的技術的一個必要的挫折。

+0

蘋果告訴我們使用鍵值存儲來確定iCloud數據是否已被播種。如果它不經常同步,這是行不通的。聽起來像蘋果的文檔有點破碎。 https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingSQLiteStoragewithiCloud/UsingSQLiteStoragewithiCloud.html#//apple_ref/doc/uid/TP40013491-CH3-SW30 – ngb 2014-04-22 02:07:52

1

NSUbiquitousKeyValueStore的文檔說明了同步如何工作的細節。我認爲從羅傑的假設是,當你打電話時:

[[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

它會立即上傳數據(假設網絡連接)。不是這種情況。調用synchronize只需獲取您在內存中設置的鍵和值,並將它們保存到本地磁盤緩存中。一旦完成,系統會通知iCloud有數據可以上傳。的信息的密鑰片提到synchronize方法文檔下面:

此方法不會強制新的鍵和值被寫入到 iCloud中。相反,它讓iCloud知道新密鑰和值是 可供上傳。不要立即依賴您的密鑰和值在其他設備上可用的 。系統控制這些鍵和值的上傳時間。鍵值存儲的上傳請求頻率限制爲每分鐘幾個。

Link to documentation

總之,當你的關鍵字和值被上傳到iCloud,並呼籲synchronize簡單地將它們存儲的本地緩存,並通知新的數據等待被上載的iCloud中的系統控制。