【问题标题】:How to properly save an item in CoreData with SwiftUI MVVM?如何使用 SwiftUI MVVM 在 CoreData 中正确保存项目?
【发布时间】:2022-01-16 12:25:02
【问题描述】:

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

【问题讨论】:

  • 这很可能是正确的,但这是一个非常模糊的问题。
  • @JoakimDanielson 我试图详细说明并添加更多细节。请让我知道这是否有帮助,或者我还有什么需要补充的。
  • Here 是一种方法。不完全是您要查找的内容,但您可以看到视图模型将引用的 Manger 设置
  • 在这种情况下,我不会将 MVVM 概念走得太远。保存确实是PersistanceController 的功能。否则,当您最终获得更多视图模型时,您只是在复制代码。

标签: swift core-data swiftui cloudkit


【解决方案1】:

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

}

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

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多