如何处理保存子上下文但该对象已在父上下文中删除?

时间:2013-04-26 11:51:26

标签: cocoa core-data parent-child nsmanagedobjectcontext

我有核心数据嵌套上下文设置。 UI的主队列上下文并保存到SQLite持久性存储。用于与Web服务同步数据的专用队列上下文。

我的问题是同步过程可能需要很长时间,并且有可能在主队列上下文中删除同步对象。保存专用队列时,它将因“核心数据无法解决故障”异常而崩溃。

您对如何检查此问题或配置处理此案例的上下文的方式有任何建议吗?

1 个答案:

答案 0 :(得分:5)

嵌套上下文背后没有魔力。没有额外的工作,它们无法解决许多与并发相关的问题。许多人(你似乎是其中一个人)期望开箱即用的东西是不可行的。以下是一些背景信息:

如果使用私有队列并发类型创建子上下文,则Core Data将为此上下文创建一个队列。要与在此上下文中注册的对象进行交互,您必须使用performBlock:或performBlockAndWait:。这两个方法最重要的是确保在上下文队列中调用传递的块。没有更多 - 没有更少。

在基于非核心数据的应用程序的上下文中考虑一下。如果要在后台执行某些操作,可以创建新队列并安排块以在后台对该队列执行操作。如果您的工作已完成,您希望将后台操作的结果传达给应用程序逻辑中的另一个层。当用户同时删除与后台操作的结果相关的对象/数据时会发生什么?基本相同:崩溃。

您遇到的不是核心数据特定问题。一旦引入并发,这是一个问题。你需要的是考虑你的孩子和父母背景之间的政策或某种契约。例如,在从根上下文中删除对象之前,应该取消在其他队列上运行的所有操作/块,并在实际删除对象之前等待取消完成。