У меня есть универсальное приложение, написанное в 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)")
}
Я действительно на стенде все еще здесь. Я просто не уверен, почему он «обычно» работает ...
Вы уверены, что эти изменения пропали без вести, или это возможно, что они просто занимают много времени? iCloud - механизм асинхронной передачи. Время от времени передача данных может занять несколько минут. Кроме того, уверены ли вы, что вы не случайно сохраняете на втором устройстве, переопределяя это изменение? Настоящий тест заключается в том, что на обоих устройствах отображается одинаковое число, и вы достаточно долго ждали. –
Я подождал несколько минут. Я понимаю, что Apple не дает никаких гарантий относительно своевременности, но я долго ждал. В некоторых случаях некоторые из данных только не распространялись на одно из трех устройств, так что два остались в синхронизации. Не всегда одно и то же устройство не синхронизируется должным образом. Он просто действует как система с потерями. – Scooter