【发布时间】:2021-07-15 03:41:44
【问题描述】:
我来自react-native 背景,我无法理解 SwiftUI 中 MVVM 的特定部分:拥有相同实体的多个视图。
我正在构建一个带有帖子的简单社交媒体应用。这些帖子可以在Homepage 和任何用户的Profile 页面上查看。
这就是视图模型的样子
struct HomepagePosts: ObservableObject {
@Published var posts = [Post]()
... rest of logic
}
struct ProfilePosts: ObservableObject {
@Published var posts = [Post]()
... rest of logic
}
我的问题如下。如果用户刚刚发布了帖子,则该帖子将显示在主页和他的个人资料中。如果用户决定更新帖子怎么办?帖子将如何在所有地方更新?
在 React 中,这是通过规范化状态来完成的。不是保留单独的 posts 数组,而是保留 2 个 postIds 数组和一个字典,其中 postId 作为键,整个 Post 对象作为值。这样一来,更新帖子就会在一个地方更新它,并且每个视图都会直接更新。
你如何在 SwiftUI 中做到这一点?
【问题讨论】:
-
什么是帖子类型?
-
@mahan simple
structid和content作为属性。 -
我认为这里的问题是您有 2 个 ObservableObject 并且它们彼此不相关。最好只有一个“真相”来源并在任何地方使用它。例如:“struct PostsModel:ObservableObject”。这样你就避免了必须不断同步不同 ObservableObject 中的两个 Post 数组的复杂性。
-
@workingdog 是的,我想要一个事实来源。但是,如果我有
PostsModel结构,我在哪里保存主页和个人资料的帖子数组? - 另外,这两个对象确实相互关联。它们是不同的“帖子提要”,可以包含相同的帖子 -
将事物的状态(在本例中为帖子)保存在一个 ObservableObject 中(只有一个,不是每个 View 一个)。然后任何依赖于帖子的视图(例如主页和个人资料)都将引用该对象(作为 ObservedObject 或可能更干净的 EnvironmentObject)。对帖子的任何更改都会导致这些视图自动刷新(忘记 MVVM 和 Viper)。如果需要,可以将其他属性添加到模型中或制作单独的模型。最后, Post 本身可以是一个结构体,但持有它的模型不能,因为
ObservableObjects必须是带有引用的类。你所拥有的无法编译。