仅针对该MOC具有使用NSManagedObjectContext
初始化的子MOC的情况,使用NSMainQueueConcurrencyType
初始化NSPrivateQueueConcurrencyType
?
提供一些背景知识:我的应用程序具有传统结构,主表视图由NSFetchedResultsController
驱动,数据使用具有自己的MOC的NSOperation
子类从Web服务异步导入。我不确定在这种情况下两个MOC是否应该使用NSConfinementConcurrencyType
(默认情况下,我相信)或者与主线程上的获取结果控制器关联的MOC是否应该使用NSMainQueueConcurrencyType
和背景MOC应该使用NSConfinementConcurrencyType
。
答案 0 :(得分:58)
首先是Core Data新上下文类型的配方。
NSMainQueueConcurrencyType
创建一个与主调度队列相关联的上下文,从而创建主线程。您可以使用这样的上下文将其链接到在主线程上运行所需的对象,例如UI元素。
NSPrivateQueueConcurrencyType
创建并管理要运行的私有调度队列。您必须使用新方法performBlock:
或performBlockAndWait:
。然后,上下文将在其自己的专用队列上执行传递的块。
最后,NSConfinementConcurrencyType
是默认类型,可以在创建它的线程中使用 。因此,在NSOperation
中,您已经以正确的方式使用它。一个简单的说明。如果要将其用作子上下文,则需要具有“队列上下文”(NSMainQueueConcurrencyType
或NSPrivateQueueConcurrencyType
)。
现在,关于你的问题。
正在使用初始化NSManagedObjectContext NSMainQueueConcurrencyType仅适用于MOC具有的情况 使用NSPrivateQueueConcurrencyType?
初始化的子MOC
不,没必要。是的,您可以设置一个在后台执行某些工作的私有上下文,然后将检索到的对象推送到主要上下文,但我会做相反的事情:使用NSPrivateQueueConcurrencyType
作为主上下文和{{1} }作为前者的子语境。这样,主上下文将仅处理内存中的对象。保存到磁盘仅由专用队列执行。
NSMainQueueConcurrencyType
类使用此方法。保存到磁盘是在后台线程(专用队列)中执行的。通过这种方式,UI不会冻结。
答案 1 :(得分:4)
NSMainQueueConcurrencyType
主要用于与UI相关联的上下文。
为了保持UI响应,大多数业务逻辑最好在后台线程和“后台”上下文中完成。但是UI本身需要在某个时刻使用上下文,即NSMainQueueConcurrencyType
。
使用NSMainQueueConcurrencyType
的子上下文非常适合编辑可以立即保存更改的窗格,即提交到父上下文。父母不需要使用NSMainQueueConcurrencyType
。
NSConfinementConcurrencyType
是默认类型。它将上下文链接到当前线程,顺便说一下,它通常是主线程。您不应该依赖默认类型,而是在最简单的应用程序中。 NSMainQueueConcurrencyType
和NSPrivateQueueConcurrencyType
是最好的,因为您准确知道每个上下文使用哪个队列。