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

Cocoa 如何处理在子上下文中保存,但在父上下文中已删除对象?,cocoa,core-data,parent-child,nsmanagedobjectcontext,Cocoa,Core Data,Parent Child,Nsmanagedobjectcontext,我有核心数据嵌套上下文设置。UI的主队列上下文并保存到SQLite持久存储。用于将数据与web服务同步的专用队列上下文 我的问题是同步过程可能需要很长时间,并且有可能在主队列上下文中删除同步对象。保存专用队列时,它将崩溃,出现“核心数据无法完成故障”异常 关于如何检查此问题或如何配置上下文以处理此情况,您有什么建议吗?嵌套上下文背后没有什么神奇之处。如果没有额外的工作,它们不会解决很多与并发相关的问题。许多人(你似乎就是其中之一)希望事情能开箱即用,而这些事情本不应该发生。以下是一些背景信息:

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

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


关于如何检查此问题或如何配置上下文以处理此情况,您有什么建议吗?

嵌套上下文背后没有什么神奇之处。如果没有额外的工作,它们不会解决很多与并发相关的问题。许多人(你似乎就是其中之一)希望事情能开箱即用,而这些事情本不应该发生。以下是一些背景信息:

如果使用专用队列并发类型创建子上下文,则核心数据将为此上下文创建队列。要与在此上下文中注册的对象交互,必须使用performBlock:或performBlockAndWait:。这两个方法所做的最重要的事情是确保调用上下文队列上传递的块。不多也不少

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


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

谢谢你的回答。但我想知道CoreData是否提供了任何机制来检查子上下文中数据的存在性?或者任何更好的解决方案。您可以使用现有的ObjectWithId:error:(NSManagedObjectContext)。在这种情况下,不要使用objectWithID:。但最好有某种“理智”的政策。太多的并发是有害的。即使使用嵌套的上下文和并发类型,核心数据和并发也只能通过仔细考虑用例才能实现。我很抱歉成为坏消息的使者。