我有一個使用xCode 6.3.2在Swift中編寫的通用應用程序。它目前非常簡單,因爲當我按下一個按鈕時,會生成一個隨機數,然後使用CoreData進行存儲。這完美工作,直到我實施iCloud。啓用iCloud存儲新的隨機數並不總是傳播到其他設備上。它大部分時間都在使用,但並不總是如此。iOS 8 CoreData iCloud同步一致性問題
我使用的是iPad的空氣,iPhone 6 Plus和iPhone 4S
測試我使用以下三種通知觀察員:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "persistentStoreDidChange", name: NSPersistentStoreCoordinatorStoresDidChangeNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "persistentStoreWillChange:", name: NSPersistentStoreCoordinatorStoresWillChangeNotification, object: managedContext.persistentStoreCoordinator)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "receiveiCloudChanges:", name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: managedContext.persistentStoreCoordinator)
這裏是第三個功能:
func receiveiCloudChanges(notification: NSNotification)
{
println("iCloud changes have occured")
dispatch_async(dispatch_get_main_queue())
{
self.activityIndicator.startAnimating()
self.updateLabel.text = "iCloud changes have occured"
self.managedContext.performBlockAndWait
{() -> Void in
self.managedContext.mergeChangesFromContextDidSaveNotification(notification)
}
self.reloadTextViewAndTableView()
self.activityIndicator.stopAnimating()
}
}
我不會嘗試更新UI,直到managedContext完成合並,並且我正在執行主線程上的所有操作。我真的很茫然,爲什麼一臺設備上的更改只能在大約90-95%的時間內在第二個或第三個設備上顯示。
作爲我的試驗和錯誤的一部分,當我從我的測試設備上刪除應用程序並重新安裝時,有時會發出一條消息,指出iCloud操作正在等待,但無論等候多久,設備不同步,他們保持這種方式。即使它們不同步,如果我添加另外一兩個數字,它們仍然會傳播到其他設備,但是我總會丟失更多數據。它似乎在大約90%的時間內工作。
我用下面的方法來更新UI:
func reloadTextViewAndTableView()
{
let allPeopleFetch = NSFetchRequest(entityName: "Person")
var error : NSError?
let result = managedContext.executeFetchRequest(allPeopleFetch, error: &error) as! [Person]?
//Now reload the textView by grabbing every person in the DB and appending it to the textView
textView.text = ""
allPeople = managedContext.executeFetchRequest(allPeopleFetch, error: &error) as! [Person]
for dude in allPeople
{
textView.text = textView.text.stringByAppendingString(dude.name)
}
tableView.reloadData()
println("allPeople.count = \(allPeople.count)")
}
我真的在展臺還在這裏。我只是不知道爲什麼它「通常」工作...
你確定這些變化是否失蹤,或者它們是否可能需要很長時間才能發現? iCloud是一個異步傳輸機制。數據有時可能需要幾分鐘才能傳輸。另外,您是否確定不會意外保存在第二臺設備上,覆蓋更改?真正的測試是,如果兩個設備最終顯示相同的號碼,並且您已經等待了足夠長的時間。 –
我等了好幾分鐘。我意識到蘋果公司對時效性沒有保證,但我等了很久。在某些情況下,一些數據只傳播到三個設備中的一個,所以兩個設備保持同步。它並不總是同一臺設備無法正確同步。它只是一個有損系統。 – Scooter