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 - 相当于使用带有示例的类别 - Swift
如何通过带有 FetchedResults 和 CoreData 的导航链接传递数据?
带有 NSFetchResultController 的 CoreData:使用 fetchObjects 中的属性进行的无效更新