NSFetchedResultsController 委托方法在 mergeChangesFromContextDidSaveNotification 后未触发

Posted

技术标签:

【中文标题】NSFetchedResultsController 委托方法在 mergeChangesFromContextDidSaveNotification 后未触发【英文标题】:NSFetchedResultsController delegate methods not firing after mergeChangesFromContextDidSaveNotification 【发布时间】:2010-10-21 04:51:19 【问题描述】:

一直在浏览与此类似的帖子,但没有人回答我的问题。

与 CoreDataBooks 一样,我使用单独的 MOC 来添加和编辑项目并观察正确的通知,如下所示:

- (void)addControllerContextDidSave:(NSNotification*)saveNotification 

  NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
  // Merging changes causes the fetched results controller to update its results
  [context mergeChangesFromContextDidSaveNotification:saveNotification];
  NSLog(@"merging changes in rootview");

当我进行保存时,它被正确观察到。调试通知显示正确的上下文,调试上下文显示刚刚添加的项目。日志消息也打印得很好。但什么也没有发生。 NSFetchedResultsController 的委托方法都不会触发,表格视图也不会更新。

我尝试不缓存或清除它。我在 tableView 上尝试了reloadData,但没有。 当我退出应用程序并重新启动时,它显示正常。

更新: 通知确实包含正确的上下文作为它的object,其中包含正确的项目,但userInfo 哈希中没有任何内容:

userInfo = 
  inserted = "(\n)";
  updated = "(\n)";

所以看起来通知中没有任何更改,尽管更改的项目具有正确的上下文....嗯。

【问题讨论】:

【参考方案1】:

最愚蠢的错误奖太棒了......克里斯托夫!!

通知未显示任何内容的原因是我忘记在单独的 MOC 上进行保存,然后再调用设置通知的代理,然后再次保存。

由于 MOC 刚刚保存,第二次保存没有任何变化,因此通知保持空白。删除第一次保存,我应该早点做,确实解决了问题。

【讨论】:

以上是关于NSFetchedResultsController 委托方法在 mergeChangesFromContextDidSaveNotification 后未触发的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?