我正在尝试采用 iCloud 和 CoreData 的 WWDC 2012 示例代码(链接到 github 示例代码),并且需要一些帮助来理解那里发生的事情。
我有一个表格视图,它从 NSFetchedResultsController 中获取其内容,就像在示例中一样。NSFetchedResultsController 与示例提供的 CoreDataController 中的主 NSManagedObjectContext 连接。对条目的更改从一台设备同步到另一台设备,它就像一个魅力。但是没有地方将来自 iCloud 的更改实际合并到主上下文中。我见过很多使用 NSPersistentStoreDidImportUbiquitousContentChangesNotification 合并更改的示例,但在此代码中从未发生过。
但奇怪的是:我从主上下文中取出一个对象并持有它。如果我收到 NSPersistentStoreDidImportUbiquitousContentChangesNotification 我使用 objectId 并从 NSMangedObjectContext 重新加载对象:
NSManagedObjectID* objectId = [myObject objectID];
NSManagedObject* theNewObject = [[_coreDataController mainThreadContext] objectWithID:objectId];
myObject = theNewObject;
但该对象不是最新的。即使我使用对象的唯一属性使用谓词进行提取。但是带有 NSFetchedResultsController 的表视图显示了更改。我在这里想念什么?
编辑1(阅读汤姆的回答后):
我添加了一个观察者NSPersistentStoreDidImportUbiquitousContentChangesNotification
:
- (void)iCloudupdate:(NSNotification*)note {
NSManagedObjectContext* moc = [[CoreDataController sharedController] mainThreadContext];
[moc performBlock:^{
[moc mergeChangesFromContextDidSaveNotification:note];
[self refreshObject];
}];
}
该方法refreshObject
使用NSManagedObjectID
来从主 MOC 获取对象,但它仍然是旧版本。