何时使用核心数据的NSMainQueueConcurrencyType?

初始化一个使用NSMainQueueConcurrencyTypeNSManagedObjectContext仅适用于MOC有一个使用NSPrivateQueueConcurrencyType初始化的子MOC的情况?

为了给出一些背景知识:我的应用程序有一个传统的结构,主表视图是由NSOperation驱动的,而数据是使用具有自己的MOC的NSOperation子类从Web服务asynchronous导入的。 我不确定这种情况下的两个MOC是否应该使用NSConfinementConcurrencyType (我相信是默认的),或者主线程上的获取结果控制器的MOC是否应该使用NSMainQueueConcurrencyType ,后台MOC应该使用NSConfinementConcurrencyType

首先是核心数据新上下文types的配方。

NSMainQueueConcurrencyType创build一个与主调度队列和主线程相关联的上下文。 您可以使用这样的上下文将其链接到在主线程上运行所需的对象,例如UI元素。

NSPrivateQueueConcurrencyType创build并pipe理一个私有的调度队列进行操作。 您必须使用新的方法performBlock:performBlockAndWait: 上下文将在自己的专用队列上执行传递的块。

最后, NSConfinementConcurrencyType是默认types, 只能在创build它的线程中使用。 所以,在你的NSOperation ,你已经以正确的方式使用了它。 一个简单的说明。 如果要将其用作子上下文,则需要具有“队列上下文”( NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType )。

现在,关于你的问题。

初始化一个使用NSMainQueueConcurrencyType的NSManagedObjectContext仅适用于MOC有一个使用NSPrivateQueueConcurrencyType初始化的子MOC的情况?

不,没有必要。 是的,你可以设置一个私人的背景,在后台做一些工作,然后把检索到的对象推到主要的,但我会做相反的事情:使用NSPrivateQueueConcurrencyType作为主上下文和NSMainQueueConcurrencyType作为前者的子上下文。 这样,主要上下文将只处理内存中的对象。 保存到磁盘只能由专用队列执行。

这种方法被UIManagedDocument类使用。 保存到磁盘是在后台线程(私有队列)中执行的。 用这种方式,UI不会被冻结。

NSMainQueueConcurrencyType主要用于链接到UI的上下文。

为了保持UI的响应,大部分业务逻辑最好在后台线程和“后台”上下文中完成。 但是UI本身需要在某个时候使用上下文, NSMainQueueConcurrencyType

具有NSMainQueueConcurrencyType子上下文非常适合于编辑可以一次保存更改的窗格,即提交给父上下文。 父级不需要使用NSMainQueueConcurrencyType

NSConfinementConcurrencyType是默认types。 它将上下文链接到当前线程,顺便说一句,通常是主线程。 你不应该依赖于默认的types,而是在最简单的应用程序中。 NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType是最好的,因为您准确知道每个上下文使用哪个队列。