何时使用Core Data的NSMainQueueConcurrencyType?

Joh*_*ley 33 iphone cocoa-touch core-data nsmanagedobjectcontext ios

正在初始化一个NSManagedObjectContext使用NSMainQueueConcurrencyType只为那MOC存在使用初始化的孩子MOC的情况NSPrivateQueueConcurrencyType

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

Lor*_*o B 59

首先是Core Data新上下文类型的配方.

NSMainQueueConcurrencyType创建与主调度队列相关联的上下文,从而创建主线程.您可以使用此类上下文将其链接到在主线程上运行所需的对象,例如UI元素.

NSPrivateQueueConcurrencyType创建和管理要操作的专用调度队列.您必须使用新方法performBlock:performBlockAndWait:.然后,上下文将在其自己的专用队列上执行传递的块.

最后,NSConfinementConcurrencyType是默认类型,只能在创建它的线程中使用.所以,在你的内心中NSOperation,你以正确的方式使用它.一个简单的说明.如果要将其用作子上下文,则需要具有"队列上下文"(NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType).

现在,关于你的问题.

是否仅在MOC具有使用NSPrivateQueueConcurrencyType初始化的子MOC的情况下使用NSMainQueueConcurrencyType初始化NSManagedObjectContext?

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

这种方法被UIManagedDocument班级使用.保存到磁盘是在后台线程(专用队列)中执行的.以这种方式,UI不会冻结.