Почему мой список SwiftUI заполняется одним и тем же элементом 4 раза вместо всех 4 элементов?

Я читаю данные из Firestore и анализирую их в пользовательской модели Thought

Для каждого документа в моей коллекции Firestore я добавляю новый объект Thought к объекту @Published var 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(){
        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)
            }
            print(self.thoughts) //PRINTS 4 DIFFERENT THOUGHT OBJECTS
        }
    }
}

struct ThoughtsView: View {

    @ObservedObject var observer = Observer()

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

                    ThoughtCard(color: thought.color,
                                thought: thought.thought,
                                name: thought.name)
                    //HERE I GET THE SAME CARD 4 TIMES INSTEAD OF 4 DIFFERENT CARDS
                }
            }
        }
    }
}

Когда я печатаю thoughts, я вижу все 4 документа, которые в настоящее время находятся в моей базе данных Firestore. Однако, когда я пытаюсь выполнить итерацию по thoughts в своем списке, я просто использую один и тот же объект Thought 4 раза вместо 4 разных объектов Thought.

Я думаю, что проблема заключается в List и в том, как я перебираю self.observer.thoughts, но я не уверен, что делаю неправильно. Как заполнить список 4 объектами в self.observer.thoughts?


person Austin Berenyi    schedule 19.11.2019    source источник


Ответы (1)


Это действительно была проблема с моим списком. Как только я добавил параметр id:, похоже, что List смог идентифицировать каждый объект Thought и отображать их соответствующим образом.

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)
                }
            }
        }
    }
}
person Austin Berenyi    schedule 19.11.2019