33

是否仅在 MOC 有一个NSManagedObjectContext使用NSMainQueueConcurrencyType初始化的子 MOC 的情况下初始化 using NSPrivateQueueConcurrencyType

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

4

2 回答 2

59

首先是关于 Core Data 新上下文类型的秘籍。

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

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

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

现在,关于你的问题。

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

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

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

于 2012-06-24T09:55:25.810 回答
4

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

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

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

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

于 2012-06-24T09:58:06.793 回答