Swift调用Firebase Realtime Database getData接口存储结构变更后无返回
问题产生原因
- 缓存不匹配:
food节点为数组结构时曾成功拉取过数据,本地生成了对应结构的缓存。调整为UUID为键的对象结构后,旧缓存和新数据结构不匹配,无法命中。 getData()方法的特性限制:Firebase Realtime Database的getData()方法默认优先拉取服务器最新数据,不会主动读取本地磁盘缓存,仅当开启了磁盘持久化且对应路径有活跃监听器同步过最新数据时才会命中缓存。当设备离线、网络连接失败且无匹配缓存时,就会抛出对应报错。
修复方案
- 开启磁盘持久化(建议全局配置,在App启动完成、初始化Firebase后添加以下代码):
Database.database().isPersistenceEnabled = true
开启后所有拉取过的数据都会自动缓存到本地磁盘,离线场景下也可以正常读取。
- 替换
getData()为更适配离线场景的observeSingleEvent(of: .value)方法,该方法会优先读取本地缓存,无缓存时再请求服务器,适配大多数业务场景,修改后的代码如下:
private let db = Database.database().reference(withPath: "food") func fetchFoods() { db.observeSingleEvent(of: .value, with: { snapshot in // 数据解析逻辑 guard let foodDicts = snapshot.value as? [String: Any] else { print("ERROR: type cast failed") return } // 后续处理foodDicts的业务逻辑 }) { error in print("ERROR") print(error.localizedDescription) } }
- 可选适配方案:如果必须使用
getData(),可以添加错误重试逻辑,当触发离线缓存错误时,降级到监听本地缓存数据,同时等待网络恢复后同步最新数据。
内容的提问来源于stack exchange,提问作者dsynkd
相关产品推荐
相关产品推荐

