2

它们应该相同吗?父级有什么样的并发类型?

每次子执行executeFetchRequest 时,都会询问父级。如果来自不同线程的多个子进程执行相同类型的 executeFetchRequest 会怎样?

如果父级被声明为具有主并发类型,然后另一个线程上的子级执行executeFetchRequest,会发生什么?它会等到主线程运行,然后给出结果,然后继续线程吗?什么?

基本上我有各种等待锁定问题,我想了解更多。

实际上,如果网络上有关于多线程父子关系的常见做法的资源,我会感到震惊。在IOS5中我们需要做performBlock。我们是否需要在所有命令中为核心数据执行此操作,因为这意味着此处需要对代码进行大量更改。

更新:

http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/CoreData/Articles/cdConcurrency.html#//apple_ref/doc/uid/TP40003385-SW1已经过时了吧?

4

2 回答 2

4

使用父/子上下文的详细信息在核心数据发行说明文档中列出,其中指出:

因此,您不能使用使用线程限制类型创建的父上下文(请参阅“托管对象上下文的并发支持”</a>)。

因此,要回答您的问题,父上下文必须具有NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType的并发类型。子上下文可以具有任何并发​​类型。

对于一个很好的概述和大量示例代码,我会查看Marcus Zarra 的核心数据视频课程他的书的 beta 版本

于 2013-01-27T19:45:31.020 回答
1

除了WWDC 2012 视频和关于父子上下文的发行说明之外,Apple 没有发布任何真实文档。该视频非常详细地介绍了如何使用它们以及您可能需要使用 performBlock 或 performBlockAndWait 的极少数情况。

大多数人错过的重要一点是并发类型是指上下文将使用哪个线程来访问核心数据堆栈的其余部分,而不是创建上下文的线程。只要您继续实现线程限制模式,您几乎不需要在自己的代码中使用 performBlock 或 performBlockAndWait 。这样做通常会触发死锁(尤其是当一个或多个上下文是 NSMainQueueConcurrencyType 时)。

NSMainQueueConcurrencyType - 适用于 UI 中使用的 NSManagedObjects。您应该只维护其中之一。

NSPrivateQueueConcurrencyType - 适用于后台操作。从外部文件或 Web 服务导入新对象时,parentContext 是主要的 UI 上下文。当您完成创建对象时,save会自动通知 parentContext 更改。您还可以使用私有上下文作为 UI 上下文的父级,以便在不阻塞 UI 的情况下从磁盘加载和保存存储。

因此,如果您创建子上下文并执行获取请求,它会使用线程(由并发类型指定)自动与父上下文交互。它将自动适当地使用 performBlock。当您保存子上下文时,父上下文会自动获取合并的更改,而无需您对父上下文执行任何操作。

如果您必须使用 performBlock 或 performBlockAndWait,则不再使用线程限制模式。它在线程限制模式中唯一有效的情况是跨越“表亲”上下文,其中父级有多个子级,一个子级的更改保存到父级,父级将这些更改下推给其他子级。

于 2013-01-27T18:25:13.260 回答