React Native中如何清除Firebase快照的本地持久化缓存
Firebase Firestore快照缓存问题解答
旧值来源说明
你遇到的重启应用后首次监听器返回旧数据的现象,确实是Firebase Firestore默认开启的本地离线持久化缓存导致的。Firestore默认会把监听过的文档数据持久化存储在本地,应用重启后首次触发监听器时,会优先返回本地缓存的历史数据,待和服务端同步完成后,再返回最新的服务端数据。
清除旧快照缓存的可选方案
方案1:全局关闭离线持久化
如果你的业务不需要离线使用Firestore的能力,可以在初始化Firestore时直接关闭持久化配置,配置需要在所有Firestore请求发起前调用,代码如下:
firebase.firestore().settings({ persistence: false })
关闭后本地不会持久化存储任何快照数据,重启应用后监听器会直接拉取服务端最新数据,不会再返回历史旧值。
方案2:指定时机手动清除全量缓存
如果大部分场景你仍需要离线持久化能力,仅需要在应用重启等特定时机清除旧缓存,可以调用clearPersistence()方法,建议在应用初始化阶段、尚未发起任何Firestore请求时调用,代码如下:
firebase.firestore().clearPersistence() .then(() => { // 缓存清除成功后续逻辑 }) .catch(err => { // 存在活跃监听器或未同步的本地写操作时,清除会失败,可在此处处理异常 })
方案3:业务层过滤本地缓存数据
如果你不想修改全局配置也不想清除缓存,可以在快照回调中通过元数据判断数据来源,直接忽略本地缓存返回的结果,仅处理服务端同步的最新数据:
unsubscribe = firebase .firestore() .collection('collection') .doc(id) .onSnapshot( function(doc) { // 本地缓存返回的数据直接跳过,不进入业务逻辑处理 if (doc.metadata.fromCache) return // 其他业务代码 }, );
该方案的弊端是离线状态下监听器不会返回任何可用数据,需要离线使用能力的场景不适用。
内容的提问来源于stack exchange,提问作者Riku
相关产品推荐
相关产品推荐

