在 Firestore 中使用 addSnapshotListener 时数据未正确显示

Posted

技术标签:

【中文标题】在 Firestore 中使用 addSnapshotListener 时数据未正确显示【英文标题】:Data not displayed correctly when using addSnapshotListener in Firestore 【发布时间】:2020-04-29 10:00:20 【问题描述】:

我正在使用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

上面的代码有问题吗?

谢谢。

【问题讨论】:

ItemModel 是否实现了Identifiable?这是必需的,因此ListView 可以区分元素。另外,我想知道您是否通过 Firebase 使用 Firestore。 【参考方案1】:

前几天我遇到了这个问题。 commentElements 是我的课程,而 cmets 是我发布的变量。我认为 id: .self 是问题,但我不记得了。 (我在 Firebase 上存储了 3 个评论文档,但它只返回了第一个评论 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()

【讨论】:

以上是关于在 Firestore 中使用 addSnapshotListener 时数据未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firestore 中正确使用 arrayUnion?

无法使用 SwiftUI 从 Firebase / Firestore 中删除文档

在 iOS 中访问其他项目 Firestore 数据

如何使用firestore在当前用户文档中添加数据?

使用 Javascript 在 Firestore 中存储嵌套集合

在 Flutter 中使用 Cloud Firestore 创建无限列表