为什么我的 SwiftUI 列表再次附加所有对象而不是更新现有对象?

Why is my SwiftUI List appending all objects again instead of updating existing objects?

我正在使用 .addSnapshotListener 从 Firestore 读取数据并将其解析为自定义模型 Thought

对于我的 Firestore 集合中的每个文档,我将一个新的 Thought 对象附加到 @Published var thoughts 并在 List.

中遍历 thoughts
struct Thought: Identifiable {

    public var id: String?
    public var name: String
    public var thought: String
    public var color: String
}

class Observer: ObservableObject {

    @Published var thoughts = [Thought]()

    init(){

        self.thoughts.removeAll()

        let db = Firestore.firestore()

        db.collection("thoughts")
        .addSnapshotListener { querySnapshot, error in
            guard let documents = querySnapshot?.documents else {
                print("Error fetching documents: \(error!)")
                return
            }

            for document in documents {

                var thoughtModel = Thought(id: "", name: "", thought: "", color: "")

                thoughtModel.name = document.data()["name"] as! String
                thoughtModel.thought = document.data()["thought"] as! String
                thoughtModel.color = document.data()["color"] as! String

                self.thoughts.append(thoughtModel)
            }
        }
    }
}

struct ThoughtsView: View {

    @ObservedObject var observer = Observer()

    var body: some View {
        VStack {
            List {
                ForEach(self.observer.thoughts, id: \.name) { thought in

                    ThoughtCard(color: thought.color,
                                thought: thought.thought,
                                name: thought.name)
                }
            }
        }
    }
}

当我在我的 Firestore 集合中进行更改或添加文档时,所有对象都附加到我的 List 而不是我的 List 只是像我期望的那样被更新。换句话说,如果我的 List 中有 3 个项目,并且我更改了其中一个 Firestore 文档中的值,我最终会在 List 中得到 6 个项目,其中包括原始的 3 个和一个副本原来的3(修改)。

如何正确更新我的 List

all objects are appended to my List instead of my List just being updated like I expect.

您的期望是正确的,但是...

@ObservedObject var observer = Observer()

...您的观察者仅创建一次并保存在 ThoughtsView 之外,因此即使在更新时重建视图,观察对象也使用相同的方式,所以 ...

init(){
   self.thoughts.removeAll()

这段代码只被调用一次,因为它在构造函数中,实际上是无用的。然而这部分

self.thoughts.append(thoughtModel)

... 在每次更新时调用,因为它在 .addSnapshotListener 中。结果你看到你看到的 - 连续追加。

解决方案。从代码的逻辑来看,我假设你的意思是这个容器清理的地方

   self.thoughts.removeAll()
   for document in documents {