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

Posted

技术标签:

【中文标题】CoreData:带有privateQueueConcurrencyType的backgroundContext和子上下文之间的区别?【英文标题】:CoreData: difference between backgroundContext and child context with privateQueueConcurrencyType? 【发布时间】:2019-10-04 09:20:20 【问题描述】:

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

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

您还可以使用privateQueueConcurrencyType 创建子上下文

let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

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

那么这两者有什么区别,什么时候用一个和另一个呢?

【问题讨论】:

【参考方案1】:

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

let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

在引入NSPersistentContainer之前常用。另请参阅https://developer.apple.com/documentation/coredata/using_core_data_in_the_background,他们在其中声明:

初始化和配置上下文对于这两种上下文, NSManagedObjectContext 实例的初始化是一样的:让 moc = NSManagedObjectContext(concurrencyType:) 参数 作为初始化的一部分传入确定什么类型 返回 NSManagedObjectContext。当您使用 NSPersistentContainer,您将 viewContext 属性配置为 主队列 (NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType) 上下文,并配置与关联的上下文 performBackgroundTask(_:) 和 newBackgroundContext() 作为私有 队列 (NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)。

newBackgroundContext() 的文档如下:

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

newBackgroundContext() 与您提供的代码相同,以及我在上述引用中强调的一些额外内容。

在为 ios 10+ 开发时,我建议使用NSPersistentContainer,当你想阻塞调用线程时使用newBackgroundContext(),或者如果你不想调用线程阻塞当你想要调度时使用performBackgroundTask在后台工作。

在 iOS 10 之前我没有使用过 CoreData,但我认为你需要做更多的事情来使上下文在仅使用 concurrenyType 初始化它时工作。 newBackgroundContext() 不再需要这些。

【讨论】:

我会添加到@J。 Doe 的回答...观看 WWDC 2019 视频 “Making Apps With Core Data” 在 6 分 5 秒内,便捷方法 .performBackgroundTask 的口头描述“为您创建背景上下文并在您的块返回时自动处理它”。

以上是关于CoreData:带有privateQueueConcurrencyType的backgroundContext和子上下文之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

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

NSFetchRequest 带有用于递归 CoreData 实体关系的排序描述符

带有函数参数的 CoreData 谓词

CoreData - 相当于使用带有示例的类别 - Swift

如何通过带有 FetchedResults 和 CoreData 的导航链接传递数据?

带有 NSFetchResultController 的 CoreData:使用 fetchObjects 中的属性进行的无效更新