使用CoreData,您可以要求容器使用container.newBackgroundContext()
创建背景上下文。
这对于在后台使用核心数据而不影响UI主上下文很有用。
您还可以使用privateQueueConcurrencyType
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
在这种情况下,如果我没记错的话,上下文仍将在后台在另一个队列上执行。
那么两者之间的区别是什么?何时使用另一种?
答案 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()
不再需要。