我正在编写一个使用Core Data并与iCloud同步的应用。为此,我有一个我设置的UIManagedDocument,如下所示:
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:[self iCloudStoreURL]];
document.persistentStoreOptions = @{NSPersistentStoreUbiquitousContentNameKey: [document.fileURL lastPathComponent], NSPersistentStoreUbiquitousContentURLKey: [self iCloudCoreDataLogFilesURL], NSMigratePersistentStoresAutomaticallyOption: @YES, NSInferMappingModelAutomaticallyOption : @YES};
self.mydoc = document;
[document release];
[document.managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentContentsChanged:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:document.managedObjectContext.persistentStoreCoordinator];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentStateChanged:) name:UIDocumentStateChangedNotification object:document];
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.mydoc.fileURL path]]) {
// does not exist on disk, so create it
[self.mydoc saveToURL:self.mydoc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
[self populateTable];//synchronous call. few items are added
[self iCloudIsReady];
}];
} else if (self.mydoc.documentState == UIDocumentStateClosed) {
// exists on disk, but we need to open it
[self.mydoc openWithCompletionHandler:^(BOOL success) {
[self iCloudIsReady];
}];
} else if (self.mydoc.documentState == UIDocumentStateNormal) {
// already open and ready to use
}
}
我对这种方法的问题是我不断得到"乐观锁定失败"在两个设备中运行应用程序时。我在Apple的核心数据文档中读到了一种避免"避免"这种问题是将合并策略设置为NSMergeByPropertyObjectTrumpMergePolicy,这是我已经在做的事情但由于某种原因无法正常工作。
我无法找到的一件事就是如何解决这个问题。例如,如果这可能发生,我的应用程序至少应该知道并准备好处理这种行为。但我不知道如何处理这个问题。例如,如何获取冲突的对象并解决它们?因为每次发生此故障时,我都会在尝试保存文档时开始获取UIDocumentStateSavingError,并且停止获取此错误的唯一方法是终止应用并重新启动它。
答案 0 :(得分:0)
我终于弄明白了(至少,我认为我做过)。显然,在iOS6 +上(我不知道iOS5)UIManagedDocument负责所有的合并。因此,下面的观察者,它只负责调用“mergeChangesFromContextDidSaveNotification:”实际上合并了刚刚合并的内容。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentContentsChanged:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:document.managedObjectContext.persistentStoreCoordinator];
...
- (void)documentContentsChanged:(NSNotification *)notification {
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
调用“mergeChangesFromContextDidSaveNotification:”是负责触发“乐观锁定失败”的行。我删除了它,一切都按预期开始工作。不幸的是,这只持续了几个小时。现在我一直收到“iCloud Timed Out”错误,但是这个我确定这是Apple的错。
无论如何,经过大量的错误和三种不同的iCloud + Core Data方法,我想我会坚持将iCloud集成到我的应用程序中。太不稳定和马车了。我真的希望Apple可以用iOS6解决这个问题,iCloud + Core Data是一个非常强大的工具,不幸的是,它还没有准备好。
感谢所有试图提供帮助的人。