2015-06-21 3 views
1

У меня есть универсальное приложение, написанное в Swift с использованием xCode 6.3.2. В настоящее время очень просто, когда я нажимаю кнопку, генерируется случайное число, а затем сохраняется с помощью CoreData. Это работает отлично, пока я не реализую iCloud. С включенным iCloud сохранение нового случайного числа не всегда распространяется на дополнительные устройства. Он делает большую часть времени, но не всегда.Проблема с iOS 8 CoreData Конфигурация синхронизации iCloud

Я тестирование с помощью IPad Air, 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() 
     } 
} 

Я не пытаюсь обновить пользовательский интерфейс до тех пор, пока managedContext не завершит слияние, и я выполняю все в основном потоке. Я действительно недоумеваю, почему изменения на одном устройстве отображаются только на втором или третьем из примерно 90-95% времени.

Как часть моего пробного периода и ошибки при попытке удалить приложение с моих тестовых устройств и переустановить иногда появляется сообщение о том, что операция iCloud находится на рассмотрении, но не имеет значения, сколько времени я жду, устройства не синхронизированы, они остаются такими. Даже если они не синхронизированы, если я добавлю еще один или два числа, они все равно будут распространяться на другие устройства, но тогда я обязательно потеряю больше данных. Кажется, он работает около 90% времени.

Я использую следующие для обновления пользовательского интерфейса:

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

Я подождал несколько минут. Я понимаю, что Apple не дает никаких гарантий относительно своевременности, но я долго ждал. В некоторых случаях некоторые из данных только не распространялись на одно из трех устройств, так что два остались в синхронизации. Не всегда одно и то же устройство не синхронизируется должным образом. Он просто действует как система с потерями. – Scooter

ответ

0

Так что я до сих пор не знаю, как и почему CoreData иногда выходит из синхронизации, как описано выше. Я обнаружил, что если я вхожу один новый номер за другим очень быстро, когда это обычно происходит.

В качестве обходного пути я добавил кнопку к пользовательскому интерфейсу, которая позволяет пользователю принудительно выполнить повторную синхронизацию с iCloud, перестроив NSPersistentStore, используя следующую опцию.

NSPersistentStoreRebuildFromUbiquitousContentOption: true 

Я предпочел бы магазин остался в синхронизации с другими устройствами все время, но, по крайней мере, таким образом пользователь никогда не потеряете данные. Если они замечают, что им не хватает записи, которую они знают, они ввели на другое устройство, тогда все, что им нужно сделать, это нажать кнопку повторной синхронизации.

Смежные вопросы