2

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

对于我的 Firestore 集合中的每个文档,我将一个新Thought对象附加到 a@Published var thoughtsthoughts在 a 中迭代List

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像我期望的那样被更新。换句话说,如果我的 3 项中有 3 项List,并且我更改了其中一个 Firestore 文档中的值,我最终会在我的 6 项中List包含原始 3 项和原始 3 项的副本(已修改)。

如何正确更新我的List?

4

1 回答 1

3

所有对象都附加到我的列表中,而不是像我期望的那样更新我的列表。

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

@ObservedObject var observer = Observer()

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

init(){
   self.thoughts.removeAll()

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

self.thoughts.append(thoughtModel)

... 每次更新都会调用,因为它位于.addSnapshotListener. 结果,您看到了所看到的 - 连续附加。

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

   self.thoughts.removeAll()
   for document in documents {
于 2019-11-19T05:43:17.230 回答