如何使用 SwiftUI MVVM 正确保存 CoreData 中的项目?

问题描述 投票:0回答:1

我正在努力在我的项目中实现 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。

swift core-data swiftui cloudkit
1个回答
5
投票

我遵循了 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)")
    }
}

如果您对此有疑问,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.