Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:SharedCodeData示例代码(iCloud和CoreData)|如何合并更改_Ios_Core Data_Icloud - Fatal编程技术网

iOS:SharedCodeData示例代码(iCloud和CoreData)|如何合并更改

iOS:SharedCodeData示例代码(iCloud和CoreData)|如何合并更改,ios,core-data,icloud,Ios,Core Data,Icloud,我正在尝试采用iCloud和CoreData()的WWDC 2012示例代码,需要一些帮助来了解那里发生了什么 我有一个表视图,它从NSFetchedResultsController获取其内容,如示例中所示。NSFetchedResultsController与示例提供的CoreDataController中的主NSManagedObjectContext连接。对入口的更改从一个设备同步到另一个设备,它就像一个符咒。但是,没有一个地方可以将来自iCloud的更改实际合并到主上下文中。我见过很多

我正在尝试采用iCloud和CoreData()的WWDC 2012示例代码,需要一些帮助来了解那里发生了什么

我有一个表视图,它从NSFetchedResultsController获取其内容,如示例中所示。NSFetchedResultsController与示例提供的CoreDataController中的主NSManagedObjectContext连接。对入口的更改从一个设备同步到另一个设备,它就像一个符咒。但是,没有一个地方可以将来自iCloud的更改实际合并到主上下文中。我见过很多例子,其中NSPersistentStoreDidImportUbiquitousContentChangesNotification用于合并更改,但在这段代码中,这种情况从未发生过

但这里有一件奇怪的事情:我从主上下文中提取一个对象并持有它。如果收到NSPersistentStoreDidImportubiquitoUsContentChanges通知,我将使用objectId并从NSMangedObjectContext重新加载对象:

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中使用核心数据相同的事情。请帮帮我。谢谢。我应该首先对示例代码做什么更改?