Core data 核心数据父级和#x27;核心数据中的并发类型和子并发类型?

Core data 核心数据父级和#x27;核心数据中的并发类型和子并发类型?,core-data,concurrency,Core Data,Concurrency,它们应该是一样的吗?父级的并发类型是什么 每次孩子执行executeFetchRequest时,都会询问家长。如果来自不同线程的多个子线程在同一类型上执行executeFetchRequest呢 如果父线程被声明为具有主Concurence类型,然后另一个线程上的子线程执行executeFetchRequest,会发生什么情况?它会等到主线程运行,然后给出结果,然后继续线程吗?什么的 基本上,我有各种各样的等待锁问题,我想了解更多关于这一点 事实上,如果网上有一个关于多线程的父线程和子线程关系的

它们应该是一样的吗?父级的并发类型是什么

每次孩子执行executeFetchRequest时,都会询问家长。如果来自不同线程的多个子线程在同一类型上执行executeFetchRequest呢

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

基本上,我有各种各样的等待锁问题,我想了解更多关于这一点

事实上,如果网上有一个关于多线程的父线程和子线程关系的常见实践的资源,我会感到困惑。在IOS5中,我们需要执行performBlock。我们是否需要在核心数据的所有命令中都这样做,因为这意味着这里的代码有很多变化

更新:


是不是过时了?

苹果没有发布任何真正的文档,除了和关于父和子上下文的文档。视频非常详细地介绍了如何使用它们,以及您可能需要使用performBlock或performBlockAndWait的罕见情况

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

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

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

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


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

文件中列出了使用父/子上下文的详细信息,其中说明:

因此,不能使用线程限制类型创建的父上下文(请参见)

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


要获得一个很好的概述和大量示例代码,我将检查。

我在没有performBlock的情况下获得了死锁。所以我用performBlock试过了。视频讨论了导致这些死锁的原因。基本上,上下文调用performBlock,以便您与堆栈的其余部分通信。仅当您希望位于它用于与核心数据堆栈其余部分通信的线程上时才使用performBlock,该线程独立于创建它的线程。根据,您应该在
performBlock:
performBlock和Wait:
调用中执行任何涉及托管对象上下文或托管对象的工作。一个例外是,如果您在主线程上,并且正在使用具有主队列并发类型的上下文。@KrisMarkel来自发行说明:“您可以使用限制模式使用上下文,就像在OS X v10.7和iOS 5之前一样。您直接发送上下文消息;由您来确保从正确的队列发送消息。“您可以将所有内容包装在块中,但只有在您可能跨线程通信时才需要它,并且可能导致死锁。这意味着始终使用performBlock和performBlockAndWait将导致它在大多数用例中解决的更多问题。这对于受限并发类型是正确的,但使用它意味着以旧的且容易出错的方式处理并发。您最好使用私有队列并发和performBlock方法。然后,框架为您处理所有并发问题。与核心数据的并发部分并非完全过时。它详细说明了父/子上下文系统为您所做的工作。它根本没有包括如何使用parentcontext(应该是这样的!)。文档对此并不十分清楚。参考
NSConfinementConcurrencyType
,它首先指出不能将此并发类型与新的嵌套上下文功能结合使用。因此,您不能使用线程限制类型创建的父上下文。但是是的,你是对的,伊姆霍+1确实如此。