何时使用Core Data NSMainQueueConcurrency类型?

时间:2012-06-24 09:16:06

标签: iphone ios cocoa-touch core-data nsmanagedobjectcontext

仅针对该MOC具有使用NSManagedObjectContext初始化的子MOC的情况,使用NSMainQueueConcurrencyType初始化NSPrivateQueueConcurrencyType

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

2 个答案:

答案 0 :(得分:58)

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

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

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

最后,NSConfinementConcurrencyType是默认类型,可以在创建它的线程中使用 。因此,在NSOperation中,您已经以正确的方式使用它。一个简单的说明。如果要将其用作子上下文,则需要具有“队列上下文”(NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType)。

现在,关于你的问题。

  

正在使用初始化NSManagedObjectContext   NSMainQueueConcurrencyType仅适用于MOC具有的情况   使用NSPrivateQueueConcurrencyType?

初始化的子MOC

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

NSMainQueueConcurrencyType类使用此方法。保存到磁盘是在后台线程(专用队列)中执行的。通过这种方式,UI不会冻结。

答案 1 :(得分:4)

NSMainQueueConcurrencyType主要用于与UI相关联的上下文。

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

使用NSMainQueueConcurrencyType的子上下文非常适合编辑可以立即保存更改的窗格,即提交到父上下文。父母不需要使用NSMainQueueConcurrencyType

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