Данные не отображаются правильно при использовании addSnapshotListener в Firestore - PullRequest
0 голосов
/ 29 апреля 2020

Я использую addSnapshotListener для получения данных в режиме реального времени.

Когда данные добавляются в мою базу данных Firestore, я получаю неожиданный результат:

func addItem(title: String) {
    self.db.collection("items").document(stage.stageId).setData([
        "title": title,
    ]) { err in
        if let err = err {
            print("Error adding document: \(err)")
        } else {

        }
    }
}

Например, если элементы пусты и вы выполняете addItem (title:" Test ") один раз, три элемента данных с заголовком «Тест» отображаются в ListView.

struct ListView: View {
    @ObservedObject var fetcher = Fetcher()

    var body: some View {
        VStack {
            ForEach(self.fetcher.data.indices, id: \.self) { idx in
                Text(self.fetcher.data[idx].title)
            }
        }
    }
}

class Fetcher: ObservableObject {
    @Published var data: [ItemModel] = []
    private var db: Firestore!

    init() {
        db = Firestore.firestore()
        fetchData()
    }

    private func fetchData() {
        self.db.collection("items").addSnapshotListener { querySnapshot, error in
            if let error = error {
                print("Error getting documents: \(error)")
            }

            guard let documents = querySnapshot?.documents else {
                print("Error fetching documents: \(error!)")
                return
            }

            for document in documents {
                self.data.append(ItemModel(
                    title: document.data()["title"]as! String,
                ))
            }
        }
    }
}

struct ItemModel: Identifiable {
    var id = UUID()
    var title: String
}

Что-то не так с кодом выше?

Спасибо.

1 Ответ

0 голосов
/ 29 апреля 2020

У меня только что была эта проблема на днях. commentElements - это мой класс, а comments - моя опубликованная переменная. Я думаю, что id: .self была проблема, но я точно не помню. (У меня было 3 документа с комментариями, хранящихся в Firebase, но он только 3 раза возвращал первый комментарий.

List {
            ForEach(commentElements.comments, id: \.comment) { item in
            VStack(spacing: 15) {
                HStack {
                    Text("")
                        .font(.footnote)
                        .fontWeight(.regular)
                        .multilineTextAlignment(.leading)
                    Text("said on \(self.newComment.date.dateValue())")
                        .font(.footnote)
                        .fontWeight(.thin)
                }
                Text(item.comment).font(.footnote).bold()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...