2015-06-09 5 views
4

У меня есть приложение с основными данными и icloud, чтобы позволить пользователю использовать одну и ту же базу данных на нескольких устройствах. Синхронизация работает большую часть времени отлично, но иногда это не так, то есть некоторые транзакции просто пропущены.iCloud Core Data «нет документа по URL»

Когда я проверяю консоль, я получаю сообщение об ошибке:

__45- [PFUbiquityFilePresenter processPendingURLs] _block_invoke (439): CoreData: Ubiquity: Библиотекарь возвратил серьезную ошибку для начала загрузки Error Domain = BRCloudDocsErrorDomain код = 5 "Операция не может быть выполнена. (Ошибка BRCloudDocsErrorDomain 5 - Нет документа по URL-адресу)"

Довольно смешно это сообщение появляется даже при работе синхронизации.

Код подходит для последней версии «Руководства по программированию iCloud для основных данных». storeURL кодируется следующим образом:

NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
NSURL *storeURL = [documentsDirectory URLByAppendingPathComponent:@"iCloudSample.sqlite"]; 

Код для опций:

storeOptions =   @{NSPersistentStoreUbiquitousContentNameKey: @"iCloudSampleStore" , 
          NSPersistentStoreUbiquitousContentURLKey: @"iCloudSampleURL"}; 

Код для магазина:

NSPersistentStore *store = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                configuration:nil 
                   URL:storeURL 
                  options:storeOptions 
                  error:&error]; 

The слияния политики (MOC на главной qeue)

_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
[_managedObjectContext setPersistentStoreCoordinator:coordinator]; 

_managedObjectContext.mergePolicy = [[NSMergePolicy alloc] 
            initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]; 

Насколько я понимаю документы, делать не так уж много (?). Но я думаю, что я что-то упускаю, у кого-то есть идея, что проверить, изменить, попробовать? Любой, у кого была такая же проблема? Любые идеи приветствуются!

+1

У меня такая же проблема, не знаю, что это такое: S – user3065901

+1

У меня появилась обратная связь от Apple, что я должен представить отчет об ошибке - давайте посмотрим, как это работает, будет держать вас в курсе – Red

+0

У меня такая же проблема. – user3065901

ответ

1

У меня такая же проблема, и я решил удалить ее, удалив persistentStore и добавив ее снова во время работы приложения. Это всегда одна и та же проблема при выполнении нескольких изменений в первом устройстве, второе устройство не получает все изменения. Я использую следующий код, когда applicationDidBecomeActive для удаления постоянного хранилища первых:

var storeCoordinator:NSPersistentStoreCoordinator = persistentStoreCoordinator! 
     var store:NSPersistentStore = storeCoordinator.persistentStores[0] as! NSPersistentStore 
     var storeURL:NSURL = store.URL! 
     storeCoordinator.removePersistentStore(store, error: nil) 
     NSFileManager.defaultManager().removeItemAtPath(storeURL.path!, error: nil) 

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

Я считаю, что все изменения, сделанные в первом устройстве, всегда достигают второго устройства, но по какой-то странной причине они полностью не объединяются с локальными данными ядра. Я сделал некоторые странные замечания о проблеме ICloud-CoreData в:

https://stackoverflow.com/questions/32084952/core-data-to-icloud-doesnt-sync-all-changes

Я надеюсь, что это помогает.

+1

Спасибо за ваш ответ, я думаю, это просто ненадежно. Отчет об ошибке еще не ответил ни на один из них. – Red

1

Я обнаружил, что, когда мой магазин URL был . с в пути

(например,---/com.companyName.project/---)

let applicationSupportDirectory = applicationSupportDirectoryURL.URLByAppendingPathComponent("com.companyName.project") 
let iCloudStoreFileName = "iCloud.sqlite" 
lazy var iCloudStoreURL: NSURL = { 
    return self.applicationSupportDirectory.URLByAppendingPathComponent(self.iCloudStoreFileName) 
}() 

Когда я включил протоколирование, перейдя Edit Scheme... в Xcode для моего проекта и добавил:

-com.apple.CoreData.SyntaxColoredLogging 1 

файл журнала в окне отладки показал путь, который он искал был

---/com~companyName~project/--- 

Основные данные изменили . s на ~ s. Я удалил весь com.companyName.project из URL-адреса, и синхронизация, похоже, работает лучше. Но с базовыми данными и iCloud вы никогда не знаете, что за кулисами происходит много магии.

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