我正在编写一个使用 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 ,而停止收到此错误的唯一方法是终止应用程序并重新启动它。