当我的应用程序打开时,我在初始化 CoreData 实体的值时遇到了挑战。我想在持久化容器初始化后设置它们。我看到了使用 MVVM 的这个视频,我没有使用它,但展示了如何在 CoreData 初始化后立即运行获取。我为了举例而对其进行了调整:
class CoreDataViewModel: ObservableObject {
let container = NSPersistentContainer
@Published var defaultEntity?: FruitEntity = nil
init() {
container = NSPersistentContainer(name: "FruitsContainer")
container.loadPersistentStores { description, error in
if let error = error {
fatalError("Error: \(error.localizedDescription)")
} else {
print("successfully loaded PersistentStores")
}
}
setDefaultCase()
}
func fetchFruits() {
let request = NSFetchRequest<FruitEntity>(entityName: "FruitEntity")
do {
defaultEntity = try container.viewContext.fetch(request).first
} catch let error {
print("ERROR fetching: \(error)")
defaultEntity = nil
}
}
}
问题是我正在使用此视频中的代码将 ManagedObjectContext 设置为 EnvrionmentObject,这样我就可以在我可能需要它的任何视图中使用它:
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistenceController.container.viewContext)
}
此示例中的 savingEntities 对象将是我想要在应用程序中的任何位置访问的对象,但我还需要通过简单地调用以下方式在任何需要的地方使用 ManagedObjectContext:
@Environment(\.managedObjectContext) var moc
并使用默认实体,例如:
if defaultEntity != nil {
FirstView()
} else {
SecondView()
}
代表在这里有意义吗?如果我需要在数据库初始化后的某个时刻创建第二个对象,委托也会帮忙吗?
您的 CoreDataViewModel 符合 ObservableObject,因此您可以将其用作环境对象并可以在所有视图中访问它。
@StateObject var coreDataViewModel = CoreDataViewModel()
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistenceController.container.viewContext)
.environmentObject(coreDataViewModel)
}