Swift中如何通过Firebase快照监听器仅获取变更的文档?
解决Firebase集合快照监听器全量回调的问题
Firebase集合快照监听器的回调默认会返回包含当前集合所有文档的快照,但实际网络层面只会传输增量的变更数据,不会重复下载全量文档。你觉得读取量过高可能是因为在回调里全量处理了所有文档,正确的做法是利用快照的documentChanges属性,只处理发生变更的文档。
修改后的代码示例
let collectionRef = db.collection("users").document(userID).collection("Platser") collectionRef.addSnapshotListener { [weak self] snapshot, error in guard let snapshot = snapshot, error == nil else { print("监听出错: \(error?.localizedDescription ?? "未知错误")") return } // 遍历仅发生变更的文档 for change in snapshot.documentChanges { let doc = change.document let docID = doc.documentID let platData = doc.data() switch change.type { case .added: // 处理新增的文档 print("新增文档: \(docID), 数据: \(platData)") case .modified: // 处理修改的文档 print("修改文档: \(docID), 数据: \(platData)") case .removed: // 处理删除的文档 print("删除文档: \(docID)") } } }
关键说明
documentChanges会返回本次快照中所有发生变化的文档,以及对应的变更类型(新增、修改、删除),你可以针对不同类型做针对性处理,不用遍历整个集合的文档。- 如果你确实只需要监听单个特定文档的变化,可以直接给该文档添加快照监听器,而不是监听整个集合:
let docRef = db.collection("users").document(userID).collection("Platser").document("特定文档ID") docRef.addSnapshotListener { [weak self] document, error in guard let document = document, document.exists else { return } let data = document.data() // 处理单个文档的变更 }
内容的提问来源于stack exchange,提问作者Kevin Zetterlind
相关产品推荐
相关产品推荐

