CoreData:backgroundContext和带有privateQueueConcurrencyType的子上下文之间的区别?

时间:2019-10-04 09:20:20

标签: ios swift core-data nsmanagedobjectcontext

使用CoreData,您可以要求容器使用container.newBackgroundContext()创建背景上下文。

这对于在后台使用核心数据而不影响UI主上下文很有用。

您还可以使用privateQueueConcurrencyType

创建子上下文
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

在这种情况下,如果我没记错的话,上下文仍将在后台在另一个队列上执行。

那么两者之间的区别是什么?何时使用另一种?

1 个答案:

答案 0 :(得分:0)

您对上下文的初始化,即:

let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

通常在引入NSPersistentContainer之前使用。另请参见https://developer.apple.com/documentation/coredata/using_core_data_in_the_background,其中指出:

  

初始化和配置上下文对于两种上下文,   NSManagedObjectContext实例的初始化是相同的:let   moc = NSManagedObjectContext(concurrencyType:<#type#>)参数   作为初始化的一部分被传入确定哪种类型的   返回NSManagedObjectContext。当您使用   NSPersistentContainer,将viewContext属性配置为   主队列   (NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)   上下文,并配置与之关联的上下文    performBackformTask(_ :)和newBackgroundContext()作为私有   队列   (NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)。

newBackgroundContext()的文档中指出:

  

调用此方法将导致持久性容器创建并   返回一个新的NSManagedObjectContext,其concurrencyType设置为   NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType。   此新上下文将与   NSPersistentStoreCoordinator直接设置为使用   NSManagedObjectContextDidSave自动广播。

newBackgroundContext()的作用与您提供的代码相同,并且在上面的引用中已突出显示。

在为iOS 10+开发时,我建议使用NSPersistentContainer并在需要阻止调用线程时使用newBackgroundContext(),如果不想阻止调用线程,则建议使用performBackgroundTask当您想将工作分配到后台时阻止。

在iOS 10之前,我还没有使用CoreData,但是我认为您需要做更多的工作才能使上下文仅通过concurrenyType进行初始化。 newBackgroundContext()不再需要。