CoreData无法在后台MOC的保存操作期间完成故障

时间:2014-12-31 09:29:11

标签: ios core-data nsfetchedresultscontroller nsmanagedobjectcontext

我正在使用两个MOC,一个用于主线程,另一个MOC用于后台线程。 在主线程上,我有一个使用FRC(NSFetchedResultsController)的UITableView。

偶尔我运行一次大规模的保存操作,删除所有对象并构建几百个新对象......此时我想在主线程中使用UITableView刷新其数据(显然使用FRC) 。因此,主MOC注册到NSManagedObjectContextDidSaveNotification通知(从后台MOC接收)并在该阶段运行mergeChangesFromContextDidSaveNotification以确保UITableView相应地更新。

这一切正常,直到我尝试在保存操作期间滚动UITableView。当我尝试滚动视图时,“coredata无法完成故障”异常被引发。这是FRC仍然保留已被删除的对象的结果(在主MOC上接收到来自NSManagedObjectContextDidSaveNotification通知的mergeChangesFromContextDidSaveNotification之前,仍然运行保存操作)。 这是在收到mergeChangesFromContextDidSaveNotification后保存操作和UITableView更新之间的某种“竞争条件”。

与这两个MOC合作并照顾FRC的正确方法是什么,以便它能够应对这种情况?

1 个答案:

答案 0 :(得分:0)

根据apples doc

  

无法完成故障问题:您看到错误消息“Core   数据无法解决错误“。

     

原因:已删除相应对象的基础数据   来自持久性商店。

     

补救措施:你应该丢弃这个物体。

     

至少在两种情况下可能会出现此问题:

     

首先:

     

从对托管对象的强引用开始。删除托管   通过托管对象上下文对象。保存对象的更改   上下文。此时,已删除的对象已变为   故障。它没有被破坏,因为这样做会违反规则   记忆管理。

     

尝试从之前检索属性或关系   保留参考。核心数据将尝试对故障管理进行故障排除   对象但将无法执行此操作,因为该对象已从中删除   商店。也就是说,不再存在具有相同全局的对象   商店中的ID。

     

第二

     

从托管对象上下文中删除对象。未能打破所有   从其他对象到该对象的关系。保存更改。