0

我正在使用两个MOC,一个用于主线程,另一个MOC用于后台线程。 在主线程上,我有一个UITableView与FRC(NSFetchedResultsController)一起工作。CoreData在从后台保存操作期间无法完成故障MOC

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

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

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

回答

0

apples doc

故障无法履行问题:您看到错误消息,“核心 数据不能满足故障”。

原因:相应对象的基础数据已从持久性存储中删除 。

补救措施:您应该丢弃此对象。具有较强的参照管理对象

开始:

发生此问题在至少两种情况:

首先。通过托管对象上下文删除托管的 对象。保存对象 上下文中的更改。此时,被删除的对象已变成 故障。它不会被破坏,因为这样做会违反内存管理的规则。

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

第二个:

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

+0

谢谢。我读过这篇文章......考虑到我描述的“丢弃这个对象”的架构和场景,最好的方法是什么? – Joel

相关问题