【问题标题】:Proper way to use Firestore diff使用 Firestore 差异的正确方法
【发布时间】:2018-07-10 02:33:34
【问题描述】:

我正在调用此函数以从 Firestore 中检索用户: 每次修改用户时,我都想更新用户数组。

func fetchUsers( complete: @escaping ( _ success: Bool, _ users: [User], _ error: Error? )->()) {
    //self.users = []
    let circleId  = UserDefaults.standard.string(forKey: "circleId") ?? ""
    DataService.call.REF_CIRCLES.document(circleId).collection("insiders").order(by: "position", descending: false).addSnapshotListener { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
        }


        snapshot.documentChanges.forEach { diff in

            if (diff.type == .added) {
                let data = diff.document.data()
                let id = diff.document.documentID
                let user = User(key: id, data: data)
                self.users.append(user)
                complete(true, self.users, nil)
            }

            if (diff.type == .modified) {
                // Update users array if user data is modified
                if !self.users.isEmpty {
                    self.users = []
                let data = diff.document.data()
                let id = diff.document.documentID
                let user = User(key: id, data: data)
                self.users.append(user)
                complete(true, self.users, nil)
                }
            }

            if (diff.type == .removed) {
                print("Removed user: \(diff.document.data())")
            }
        }
    }
}

但是,如果只修改了一个用户并且我的 collectionview 重新加载然后只显示一个用户,我的数组总是返回 1!我如何 即使只修改了一个用户,也返回所有用户? 谢谢

新功能:

func fetchUsers( complete: @escaping ( _ success: Bool, _ users: [User], _ error: Error? )->()) {
    self.users = []
    let circleId  = UserDefaults.standard.string(forKey: "circleId") ?? ""
    DataService.call.REF_CIRCLES.document(circleId).collection("insiders").order(by: "position", descending: false).addSnapshotListener { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
        }

             snapshot.documents.forEach { diff in
                let data = diff.data()
                let id = diff.documentID
                let user = User(key: id, data: data)
                self.users.append(user)
                complete(true, self.users, nil)
         }
    }
}

现在我在我的收藏视图中看到很多重复的用户

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    您正在循环访问 QuerySnapshot.documentChanges,其中仅包含自上次快照以来发生更改的文档。

    要获取查询中的所有文档(而不仅仅是修改过的文档),请循环遍历 QuerySnapshot.documents

    DataService.call.REF_CIRCLES.document(circleId).collection("insiders").order(by: "position", descending: false).addSnapshotListener { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
        }
    
        snapshot.documents.forEach { diff in
          ...
    

    【讨论】:

    • 我做到了,但现在我的数据正在重复,每次用户修改时
    • 是的,这是预期的行为。每次调用时,insiders , you get called with all new data. You'll either have to clear the self.users` 集合都会发生变化,或者您只需使用 observeSingleEvent 监听一次,或者监听单个事件类型(即 .childAdded)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 2018-09-18
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多