iOS端从Firebase获取数据时出现时间戳错误及观察者异常触发问题
解决Firebase Value观察者首次启动两次触发(先错后对)的问题
这种首次启动时的重复触发+错误值问题我之前也碰到过,大概率是Firebase的本地缓存机制在搞鬼!
问题原因
Firebase Realtime Database SDK有个默认行为:当App首次启动时,它会先返回本地缓存中留存的旧数据(就是你看到的那个in为负数的错误值,可能是之前App异常退出时留下的缓存),然后在后台异步完成与云端的数据同步,同步完成后再返回云端的最新正确数据,这就导致了你的观察者被触发两次。
解决方案
利用Firebase快照的metadata.isFromCache属性,区分缓存数据和云端最新数据,过滤掉不需要的缓存响应:
修改你的代码如下:
histRef.queryOrdered(byChild: "whoCame/id") .queryEqual(toValue: helper.key) .observe(.value, with: { (snapshot) in // 判断当前数据是否来自本地缓存 if snapshot.metadata.isFromCache { // 可以选择忽略缓存数据,或者做临时提示处理 print("Received cached stale data, skipping processing...") return } // 只处理来自云端的最新有效数据 if let helperHistory = snapshot.value as? [String: AnyObject] { for each in helperHistory { print("days", each.value) } } })
额外说明
- 如果你的业务场景允许接受缓存数据(比如需要快速展示旧内容再更新),可以不直接return,而是先展示缓存内容,等云端数据到了再替换成正确值,提升用户体验。
- 这个问题只会在首次启动出现,后续运行时缓存已经和云端同步,所以不会再触发两次,这也符合你描述的现象。
内容的提问来源于stack exchange,提问作者sadhu_sanjay
相关产品推荐
相关产品推荐

