何时使用Core Data的NSMainQueueConcurrencyType?

34

使用NSMainQueueConcurrencyType初始化NSManagedObjectContext仅适用于该MOC具有使用NSPrivateQueueConcurrencyType初始化的子MOC的情况吗?

一些背景信息:我的应用程序具有传统的结构,其中主表视图由NSFetchedResultsController驱动,并使用具有自己的MOC的NSOperation子类从Web服务异步导入数据。我不确定在这种情况下两个MOC是否都应该使用 NSConfinementConcurrencyType (我认为是默认值),或者与主线程中的fetched results controller相关联的MOC是否应该使用NSMainQueueConcurrencyType,而后台MOC应该使用NSConfinementConcurrencyType

2个回答

60

首先,关于 Core Data 新上下文类型的设置。

NSMainQueueConcurrencyType 创建一个与主调度队列关联的上下文,因此是与主线程相关的。你可以使用这样的上下文将其链接到必须在主线程上运行的对象,例如UI元素。

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

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

现在,关于您的问题。

初始化 NSManagedObjectContext 时,使用 NSMainQueueConcurrencyType 只适用于 MOC 具有被初始化为 NSPrivateQueueConcurrencyType 的子 MOC 的情况吗?

不是必需的。是的,您可以设置一个私有上下文来完成一些后台工作,然后将检索到的对象推送到主上下文中,但我会相反:使用NSPrivateQueueConcurrencyType作为主上下文和 NSMainQueueConcurrencyType 作为前者的子上下文。这样,主上下文仅处理存储在内存中的对象。保存到磁盘只由私有队列执行。

这种方法是由 UIManagedDocument 类使用的。将保存到磁盘在后台线程(私有队列)中执行。这样可以避免 UI 卡死。


1
@Ricardo 抱歉耽搁了..我不知道...但你可以看代码。干杯。 - Lorenzo B
NSPrivateQueueConcurrencyType并不总是在私有队列上执行块。使用performBlockAndWait实际上会锁定队列并在调用线程上执行,这可能是主线程。 - malhal

4

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

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

带有NSMainQueueConcurrencyType的子上下文非常适合编辑面板,其中更改可以一次保存,即提交到父上下文。父级不需要使用NSMainQueueConcurrencyType

NSConfinementConcurrencyType是默认类型。它将上下文链接到当前线程,通常是主线程。除了最简单的应用程序外,您不应该依赖默认类型。NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType最好,因为您可以精确知道每个上下文正在使用哪个队列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接