3

我遇到了NSFetchedResultsController和CoreData的一些唠叨问题,其中任何一个我都非常感谢您获得帮助。使用NSFetchedResultsController处理背景变化

问题1 - 更新:我在后台线程上更新我的商店,导致某些行被删除,插入或更新。使用“mergeChangesFromContextDidSaveNotification:”方法将更改合并到主线程的上下文中。虽然我已经确认更新通过contextDidSaveNotifcation来完成,与插入和删除完全相同,但插入和删除操作已正确更新,但更新没有更新(例如,单元格标签未更新)。我当前的解决方法是暂时将上下文的陈旧间隔更改为0,但这看起来不是理想的解决方案。

问题2 - 删除对象:我的获取批量大小为20.如果一个对象被前20行中的后台线程删除,则一切正常。但是,如果对象位于前20行之后并且表格向下滚动,则会引发“CoreData无法完成错误”错误。我试图重新保留上下文并重新执行frc取回 - 一切都无济于事。注意:在这种情况下,不会为删除调用frc委托方法“didChangeObject ....” - 我认为这是因为当时有问题的对象没有发生故障(因为它在初始提取范围之外)。但由于某种原因,上下文仍然认为该对象在附近,尽管已从商店中删除。

问题3 - 删除部分:当行的删除导致删除部分时,我得到了“部分???中的无效行数”错误。我已经通过从NSFetchedResultsChangeMove:部分删除“reloadSection”行并用“[tableView insertRowsAtIndexPaths ....”替换它似乎工作,但我再次,我不知道这是否是最佳的解决方案。

任何帮助将不胜感激。谢谢!

回答

10

我认为你所有的问题都与提取结果控制器的缓存有关。

问题1是由FRC使用缓存对象(其ID未更改)造成的。当您添加或移除更改ID并强制更新缓存但更改对象属性的对象时,这样做可靠。

问题2是由FRC检查缓存中的对象引起的。该对象最有可能存在一个持久存在于缓存中的无关关系。当您在后台删除它时,FRC会尝试在关系另一端的对象中发生故障,但不能。

问题3:同样的问题。缓存不反映更改。

当FRC以外的某个对象正在修改数据模型时,您确实不应该使用FRC的缓存。您有两种选择:

  1. (首选)不要使用缓存。创建FRC时,将缓存属性设置为零。
  2. 随时后台进程更改数据模型时清除缓存。

当然,两个打败了首先使用缓存的目的。

仅当数据基本上是静态的和/或FRC管理更改时,缓存才有用。在任何其他情况下,您都不应该使用它,因为FRC需要重复检查实际的数据模型,以确保它对当前数据有最新的了解。它不能依靠对象复制它,因为另一个输入可能已经改变了真实的对象。

+0

非常感谢。事实上,缓存一直是我很多困境的原因。我现在只剩下1个问题 - 当我从后台上下文同步删除后保存上下文时,尽管合并策略是NSRollbackMergePolicy,但调用了frc NSFetchedResultsChangeInsert并删除了联系人重新插入。 – RunLoop 2010-06-07 15:57:56

+0

没有将过期间隔设置为0可以解决上述评论中描述的问题,但这又会导致更新更改,例如单元格标签名称更改,未反映。 – RunLoop 2010-06-07 16:04:31

+0

最后一个问题在某种程度上与我为后台moc使用单独的持久存储协调器有关。使用主要的psc结合不使用缓存解决了所有问题。 – RunLoop 2010-06-07 17:17:06

0

我的建议是:

  • 检测需要在后台线程
  • 后更改的更改主线程作为有效载荷
  • 使实际的变化,并在主线程中保存(管理对象在主线程上下文)
  • DO使用缓存FRC;你会得到更好的性能
  • 从“专业核心数据的iOS”由迈克尔·普里瓦,罗伯特·华纳
  • 报价:

    “核心数据智能地管理它的高速缓存,这样,如果该结果是由另一个呼叫更新,如果受到影响,缓存将被删除。“