2012-06-24 32 views
27

仅在MOC的子MOC已使用NSPrivateQueueConcurrencyType初始化的情况下使用NSMainQueueConcurrencyType初始化NSManagedObjectContext何时使用Core Data的NSMainQueueConcurrencyType?

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

回答

51

首先在核心数据新上下文类型的食谱。

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

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

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

现在,关于你的问题。

正在初始化使用 NSMainQueueConcurrencyType只为那MOC存在使用NSPrivateQueueConcurrencyType初始化的 孩子MOC局势的NSManagedObjectContext?

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

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

+1

@Ricardo对不起的delay..I的没有想法......但你能看到的代码。干杯。 –

+0

NSPrivateQueueConcurrencyType并不总是对私人执行队列块。随着performBlockAndWait它实际上锁定的队列,并执行调用线程,这可能是在主线程上。 – malhal

3

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

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

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

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

相关问题