带有核心数据的 SwiftUI:从私有上下文加载

SwifttUI with Core Data: load from private context

我试图在 SwiftUI 中显示一些我使用 NSManagedObjectContext 设置为私有队列创建的对象(这样如果用户按下取消,对象不会在任何地方提交,基本上 'scratchpad'商务部)。我最初创建了一个新的背景上下文:

let privateMOC = appDelegate.persistentContainer.newBackgroundContext()

然后我使用这个背景上下文创建新对象,并将 managedObjectContext 的环境变量设置为这个 MOC:

let rootView = ImportCSVMappingFieldsPage().environment(\.managedObjectContext, privateMOC)

然后我想在 SwiftUI 视图中显示创建的对象。但是,当我这样做时,应用程序崩溃并出现此错误:

SwiftUI/FetchCommon.swift:47: Fatal error: Can only use main queue contexts to drive SwiftUI

我在这里遗漏了什么吗?我应该能够在 SwiftUI 视图中显示使用后台 managedObjectContext 创建的对象,对吗?

后台上下文用于在后台执行工作。如果你想要一个用于管理用户编辑的暂存器上下文,你需要创建一个主队列上下文:

let editingContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
editingContext.parent = appDelegate.persistentContainer.viewContext

let rootView = ImportCSVMappingFieldsPage().environment(\.managedObjectContext, editingContext)

保存此上下文时,更改将合并回视图上下文。如果您取消并且上下文被销毁,则更改将被丢弃。

如果你想在后台队列上工作,然后进行用户编辑,并让整个工作都是一次性的,然后用上面编辑上下文的父级创建一个后台队列上下文。后台工作完成后,保存后台上下文。编辑上下文现在可以根据需要使用或丢弃该数据。