何时使用核心数据的NSMainQueueConcurrencyType?
初始化一个使用NSMainQueueConcurrencyType
的NSManagedObjectContext
仅适用于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
,你已经以正确的方式使用了它。 一个简单的说明。 如果要将其用作子上下文,则需要具有“队列上下文”( NSMainQueueConcurrencyType
或NSPrivateQueueConcurrencyType
)。
现在,关于你的问题。
初始化一个使用NSMainQueueConcurrencyType的NSManagedObjectContext仅适用于MOC有一个使用NSPrivateQueueConcurrencyType初始化的子MOC的情况?
不,没有必要。 是的,你可以设置一个私人的背景,在后台做一些工作,然后把检索到的对象推到主要的,但我会做相反的事情:使用NSPrivateQueueConcurrencyType
作为主上下文和NSMainQueueConcurrencyType
作为前者的子上下文。 这样,主要上下文将只处理内存中的对象。 保存到磁盘只能由专用队列执行。
这种方法被UIManagedDocument
类使用。 保存到磁盘是在后台线程(私有队列)中执行的。 用这种方式,UI不会被冻结。
NSMainQueueConcurrencyType
主要用于链接到UI的上下文。
为了保持UI的响应,大部分业务逻辑最好在后台线程和“后台”上下文中完成。 但是UI本身需要在某个时候使用上下文, NSMainQueueConcurrencyType
。
具有NSMainQueueConcurrencyType
子上下文非常适合于编辑可以一次保存更改的窗格,即提交给父上下文。 父级不需要使用NSMainQueueConcurrencyType
。
NSConfinementConcurrencyType
是默认types。 它将上下文链接到当前线程,顺便说一句,通常是主线程。 你不应该依赖于默认的types,而是在最简单的应用程序中。 NSMainQueueConcurrencyType
和NSPrivateQueueConcurrencyType
是最好的,因为您准确知道每个上下文使用哪个队列。