iOS:SharedCodeData示例代码(iCloud和CoreData)|如何合并更改
我正在尝试采用iCloud和CoreData()的WWDC 2012示例代码,需要一些帮助来了解那里发生了什么 我有一个表视图,它从NSFetchedResultsController获取其内容,如示例中所示。NSFetchedResultsController与示例提供的CoreDataController中的主NSManagedObjectContext连接。对入口的更改从一个设备同步到另一个设备,它就像一个符咒。但是,没有一个地方可以将来自iCloud的更改实际合并到主上下文中。我见过很多例子,其中NSPersistentStoreDidImportUbiquitousContentChangesNotification用于合并更改,但在这段代码中,这种情况从未发生过 但这里有一件奇怪的事情:我从主上下文中提取一个对象并持有它。如果收到NSPersistentStoreDidImportubiquitoUsContentChanges通知,我将使用objectId并从NSMangedObjectContext重新加载对象:iOS:SharedCodeData示例代码(iCloud和CoreData)|如何合并更改,ios,core-data,icloud,Ios,Core Data,Icloud,我正在尝试采用iCloud和CoreData()的WWDC 2012示例代码,需要一些帮助来了解那里发生了什么 我有一个表视图,它从NSFetchedResultsController获取其内容,如示例中所示。NSFetchedResultsController与示例提供的CoreDataController中的主NSManagedObjectContext连接。对入口的更改从一个设备同步到另一个设备,它就像一个符咒。但是,没有一个地方可以将来自iCloud的更改实际合并到主上下文中。我见过很多
NSManagedObjectID* objectId = [myObject objectID];
NSManagedObject* theNewObject = [[_coreDataController mainThreadContext] objectWithID:objectId];
myObject = theNewObject;
但该对象不是最新的。即使我使用对象的唯一属性使用谓词进行提取。但是带有NSFetchedResultsController的表视图显示了更改。我错过了什么
编辑1(阅读Tom的答案后):
我为NSpersistentStoreDidImportubiQuantiousContentChangesNotification添加了一个观察者
:
- (void)iCloudupdate:(NSNotification*)note {
NSManagedObjectContext* moc = [[CoreDataController sharedController] mainThreadContext];
[moc performBlock:^{
[moc mergeChangesFromContextDidSaveNotification:note];
[self refreshObject];
}];
}
方法
refreshObject
使用NSManagedObjectID
从主MOC获取对象,但它仍然是一个旧版本。缺少NSPersistentStoredImportubiquitoUsContentChangesNotification
是SharedCodeData示例代码中一个相当重要的遗漏。您肯定需要观察它,而您没有这样做的事实与没有看到更新的值直接相关。如果你退出应用程序并重新启动它,你可能会得到你期望的新值
在最简单的情况下,当您收到此通知时,您需要做两件事:
-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:notification]
,将传入的更改通知作为参数。这将通知您的主运行中心新值。如果内存中有未保存的更改,它们将根据MOC的合并策略与传入的更改合并(有关此处选项的更多详细信息,请参阅NSMergePolicy
文档中列出的常量)这可能是一个iOS错误。请参阅此线程: 这为我解决了这个问题:
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.stalenessInterval = 0;
这没有帮助:
[moc refreshObject:myObject mergeChanges:YES];
谢谢你的回答!文档中说,mergeChangesFromContextDidSaveNotification方法应与NSManagedObjectContextDidSaveNotification一起使用。我尝试了你建议的另一个“超长通知”,没有错误。所以我想你是对的。但是,通过objectId从MOC获取对象仍然会得到旧版本:(在此期间,我可以解决您提到的问题,但仍然认为它不正确。不过,这是一个解决方案,所以我将此标记为答案!我在Mavericks上也遇到了同样的问题。因此,此问题不仅限于iOS。将stalenessInterval设置为0解决了问题。非常感谢!您能帮助我解决吗这个问题?我不知道我应该首先做什么来使用示例代码。我不能在我的应用程序中使用来自苹果的示例代码。我不是一个新手。我在iOS5中做了与在iCloud中使用核心数据相同的事情。请帮帮我。谢谢。我应该首先对示例代码做什么更改?