我正在努力在我的项目中实现 CoreData/Cloudkit。它是使用 MVVM 架构在 SwiftUI 中构建的。我陷入了在 Apple 提供的 Xcode 模板中向 CoreData 保存/添加某些内容的部分,这是在 ContentView 文件中完成的,但是对我来说,这感觉像是应该在 ViewModel 中完成的事情。这是正确的吗?
对于其他上下文,我的项目是一个简单的游戏,分数是在 viewModel 中计算的。然后分数立即通过 ContentView 显示给用户。我还希望能够将分数保存到 Leaderboard CoreData 对象中。由于大部分与分数相关的工作都是在 viewModel 中完成的,因此对我来说,在其中而不是在视图中处理保存是最有意义的。
模板通过以下代码进行保存
let newItem = Item(context: viewContext)
newItem.timestamp = Date()
do {
try viewContext.save()
其中
viewContext
是 @Environment(\.managedObjectContext) private var viewContext
我将如何在 ViewModel 中执行此操作,因为我相信
@Enviroment
适用于 SwiftUI。
我遵循了 SwiftfullThinking 的教程,我认为他的解释和实现很棒。
所以 ViewModel 也是 PersistenceController:
class ViewModel: ObservableObject {
let container: NSPersistentContainer
@Published var savedData: [Entity] = []
init() {
container = NSPersistentContainer(name: "DataContainer") //exactname of the CoreData file
container.loadPersistentStores { (description, error) in
if let error = error {
fatalError("Error: \(error.localizedDescription)")
}
}
}
func getData() {
let request = NSFetchRequest<TargetEntity>(entityName: "Entity") //exact name as in the CoreData file
do {
try savedData = container.viewContext.fetch(request)
} catch {
print("Error getting data. \(error.localizedDescription)")
}
}
func addData(dataToSave: String) {
let newEntity = Entity(context: container.viewContext)
newEntity.data = dataToSave
saveData()
}
func saveData() {
do {
try container.viewContext.save()
getData() //to update the published variable to reflect this change
} catch let error {
print("Error: \(error)")
}
}
如果您对此有疑问,请告诉我。