SwiftUI 和数据模型 (CoreData) - 如何更改数据?

Qua*_*ntm 5 binding core-data ios swift swiftui

我对如何使用Core Datawith感到非常困惑SwiftUI。关于它的文章有很多,但每个人都只是展示精心设计的完美运作的情况。没有人展示稍微复杂的东西,我无法弄清楚。我已经尝试了两周了 (我能够对其进行编码,以便让它简单地工作;但是,我正在尝试找到一种良好且务实的方法,这就是我正在努力解决的问题)。

这是一个例子:

struct CarView: View {
    @State var car: Car

    struct Car {
        let id: UUID = UUID()
        let name: String
        let price: Int
    }

    var body: some View {
        VStack {
            Text(car.name)
            Text("\(car.price)")
        }
    }
}


struct CarView_Previews: PreviewProvider {
    static var previews: some View {
        CarView(car: .init(name: "Tesla Model X", price: 42))
    }
}

Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的构造,也很容易测试和处理,因为您可以简单地创建一个虚拟Car实例来使用 XCode Previews。

但是,如果您想向其中添加一个从数据库中提取数据的数据模型,会发生什么情况呢?假设你有一个CarManagedObject NSManagedObject子类。您如何将其连接到我们的SwiftUI视图?

您可以简单地将Car结构替换为CarManagedObject子类,因为它符合ObservableObject. 所以这样的事情会起作用:

struct CarView: View {
    @ObservedObject var car: CarManagedObject
    ...
}
Run Code Online (Sandbox Code Playgroud)

然而,现在我们已经将 与 紧密结合CarView在一起Core Data。如果没有它,您将无法再使用该视图。创建虚拟数据也很痛苦。因此,最好继续使用Car独立于一切的结构。这也是 Apple 在 WWDC 2019 第 233 场会议上所做的事情,大约从第 37 分钟开始:WWDC 2019 第 23 场会议

所以你可以这样做:


struct Car {
    let id: UUID = UUID()
    let name: String
    let price: Int

    static func create(from: CarManagedObject) -> Car {
        ...
    }
}

Run Code Online (Sandbox Code Playgroud)

在您拥有可以更改的数据之前,这一切都很有效。当底层数据发生变化时,我没有看到保持结构更新的好方法。此外,我们完全失去了传递到子视图的能力,Bindings因为该Car结构不是实际的数据源。更改它不会更改数据模型。

您可以痛苦地在两个方向上使用它来设置它Combine,但这似乎不对。我确信SwiftUI有能力做到这一点,我只是不知道如何做到。

有谁知道如何做到这一点?抱歉,如果我的意思不完全清楚。我真的很困惑。所有这些都让我头疼:D

zka*_*arj -1

我在寻找我自己的更基本答案时发现了你的问题。在这里没有找到任何东西,我继续搜索并发现了这个苹果文档页面,我认为它可以回答你的问题。然而,我(目前)没有资格说确实如此。

https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app

  • 感谢答案,不幸的是这篇文章只是关于 SwiftUI 中的一般数据管理,而不是关于如何处理 CoreData 和 SwiftUI 结构之间的同步的系统建议 (2认同)