mergeChangesFromContextDidSaveNotification 花了将近一分钟

Posted

技术标签:

【中文标题】mergeChangesFromContextDidSaveNotification 花了将近一分钟【英文标题】:mergeChangesFromContextDidSaveNotification taking almost a minute 【发布时间】:2009-12-08 22:04:23 【问题描述】:

我在一个单独的线程中有一个托管对象上下文,它正在创建几百个托管对象,当它保存时,将保存通知传递给主线程,并且我的其他上下文(在主线程上)被更新:

在线程中

[ApplicationDelegate performSelectorOnMainThread:@selector(managedObjectContextDidSave:) 
                                      withObject:notification 
                                   waitUntilDone:NO];

问题是合并需要很长时间,有时需要 40-50 秒,这会锁定主线程和 UI。有什么理由会花这么长时间来更新吗?

编辑

这似乎仅在存在当前正在显示受合并影响的数据的获取结果控制器时才会发生。有什么想法吗?

【问题讨论】:

【参考方案1】:

我假设您的NSFetchedResultsController 有一个NSFetchedResultsControllerDelegate,由于合并,它必须处理大量更新。这些更新将导致表中出现大量活动,这可能会导致延迟。

您可能需要做的是创建一个包装器方法,当在主线程上调用该方法时,该方法会暂时从NSFetchedResultsController 中删除委托,然后调用managedObjectContextDidSave,然后刷新表,然后恢复NSFetchedResultsControllerDelegate

【讨论】:

感谢您的回复。是的,我已将其范围缩小到讨厌的代表!我有点假设 FRC 所做的只是执行另一次获取并刷新表视图,然后它会收到通知,但它似乎做的远不止这些,因此需要这么长时间!实际上,我已经完全断开了我所有 FRC 的代表,因为我的实现只需要在收到通知时进行简单的重新加载。我只是听上下文的“确实改变”通知并获取/重新加载。感谢您的回答!

以上是关于mergeChangesFromContextDidSaveNotification 花了将近一分钟的主要内容,如果未能解决你的问题,请参考以下文章