核心数据中父级的并发类型和子并发类型之间的限制是什么?

时间:2013-01-27 17:58:55

标签: core-data concurrency

他们应该一样吗?父母有哪种并发类型?

每次孩子执行executeFetchRequest时,都会询问父母。如果来自不同线程的几个子节点执行相同类型的executeFetchRequest呢?

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

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

实际上,如果网上有关于多线程父母和子女关系的常规练习的资源,我将被挖掘。在IOS5中,我们需要执行performBlock。我们是否需要在核心数据的所有命令中执行此操作,因为这意味着在此处进行了大量的代码更改。

更新:

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

2 个答案:

答案 0 :(得分:4)

使用父/子上下文的详细信息在Core Data Release Notes文档中列出:

  

因此,您不能使用使用线程限制类型创建的父上下文(请参阅“Concurrency Support for Managed Object Contexts”)。

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

要获得精彩的概述和大量示例代码,我会查看Marcus Zarra's Core Data video coursebeta version of his book

答案 1 :(得分:1)

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

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

NSMainQueueConcurrencyType - 适用于UI中使用的NSManagedObjects。你应该只保留其中一个。

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

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

如果必须使用performBlock或performBlockAndWait,则不再使用线程限制模式。它在线程限制模式中唯一有效的时间是跨越“堂兄”上下文,其中父母有多个孩子,一个孩子的更改被保存到父母,而父母将这些更改推送到其他孩子。