为什么Firebase Firestore监听器初始调用时会触发两次回调?
Firestore监听器初始回调两次问题解答
核心原因
这不是数据重复拉取,是Firestore快照监听器的默认设计,触发两次回调的直接原因是你开启了includeMetadataChanges: true参数:
- 第一次回调返回的是本地缓存中的已有数据,此时快照的
metadata.isFromCache属性为true - 等SDK和服务端完成同步、拿到最新数据后,会触发第二次回调,此时
metadata.isFromCache属性为false
就算你关闭includeMetadataChanges,如果本地存在匹配查询条件的缓存数据,初始也会先返回缓存再返回服务端数据,只是元数据变化不会额外触发回调。
解决方法
根据你的业务需求选择对应方案即可:
- 如果你只需要服务端的真实数据,过滤掉缓存回调即可:
guard let snapshot = snapshot, !snapshot.metadata.isFromCache else { return }
- 如果你不需要监听元数据(比如数据是否还在同步、是否有未提交的写操作)的变化,直接将
includeMetadataChanges参数改为false,可以减少不必要的回调。
额外提示:你的代码存在命名笔误,解析后的数组命名为
cameras,但后续打印计数、回调参数用的是profiles,实际运行会触发编译错误,需要修正命名统一。
内容的提问来源于stack exchange,提问作者otymartin
相关产品推荐
相关产品推荐

