【问题标题】:SwiftUI and data models (CoreData) - How to changing data?SwiftUI 和数据模型 (CoreData) - 如何更改数据?
【发布时间】:2020-07-19 08:18:29
【问题描述】:

我对如何将Core DataSwiftUI 一起使用感到非常困惑。有大量关于它的文章,但每个人都只展示了完美运作的精心设计的情况。没有人展示更复杂的东西,我无法弄清楚。我已经尝试了两个星期。 (我能够对其进行编码以使其简单地工作;但是,我正在尝试找到一种好的实用方法,而这正是我正在努力解决的问题)。

这是一个例子:

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))
    }
}

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

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

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

struct CarView: View {
    @ObservedObject var car: CarManagedObject
    ...
}

但是,现在我们将CarViewCore Data 紧密耦合在一起。如果没有它,您将无法使用视图。创建虚拟数据也很痛苦。所以最好继续使用独立于一切的Car 结构。这也是 Apple 在 WWDC 2019 的第 233 次会议上从大约 37 分钟开始所做的事情:Session 23, WWDC 2019

所以你可以这样做:


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

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

这一切都很好,直到您拥有可以更改的数据。我看不到在基础数据更改时保持结构更新的好方法。此外,我们完全失去了将Bindings 传递给子视图的能力,因为Car 结构不是实际的数据源。更改它不会更改数据模型。

您可以痛苦地在两个方向上使用Combine 进行设置,但这似乎不对。我确信SwiftUI 能够做到这一点,我只是不知道怎么做。

有人知道怎么做吗? 抱歉,如果我的意思不完全清楚。我真的很困惑。这一切都让我头疼:D

【问题讨论】:

  • 有没有人找到一个好的解决方案?我基本上有完全相同的问题。我一直在直接使用 Core Data,但由于提到的所有原因,它的效果并不好。

标签: ios swift core-data binding swiftui


【解决方案1】:

我在寻找更基本的答案时发现了您的问题。在这里没有找到任何东西,我继续搜索并找到了这个 Apple 文档页面,我认为它可能会回答你的问题。但是,我没有资格(此时)说它确实如此。

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

【讨论】:

  • 欣赏答案,不幸的是,这篇文章只是关于 SwiftUI 中的一般数据管理,而不是关于如何处理 CoreData 和 SwiftUI 结构之间的同步的有条不紊的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多