2015-06-21 72 views
1

我有一個使用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)") 
} 

我真的在展臺還在這裏。我只是不知道爲什麼它「通常」工作...

+0

你確定這些變化是否失蹤,或者它們是否可能需要很長時間才能發現? iCloud是一個異步傳輸機制。數據有時可能需要幾分鐘才能傳輸。另外,您是否確定不會意外保存在第二臺設備上,覆蓋更改?真正的測試是,如果兩個設備最終顯示相同的號碼,並且您已經等待了足夠長的時間。 –

+0

我等了好幾分鐘。我意識到蘋果公司對時效性沒有保證,但我等了很久。在某些情況下,一些數據只傳播到三個設備中的一個,所以兩個設備保持同步。它並不總是同一臺設備無法正確同步。它只是一個有損系統。 – Scooter

回答

0

所以我仍然不知道如何或爲什麼CoreData有時會不同步如上所述。我已經發現,如果我一次又一次地輸入一個新數字,那麼通常會發生。

作爲解決方法,我在UI中添加了一個按鈕,允許用戶通過使用以下選項重建NSPersistentStore來強制重新同步iCloud。

NSPersistentStoreRebuildFromUbiquitousContentOption: true 

我更希望商店始終與所有其他設備保持同步,但至少這樣用戶將永遠不會丟失數據。如果他們注意到他們錯過了一條他們知道他們輸入了另一臺設備的記錄,那麼他們所要做的就是點擊重新同步按鈕。