ios - Firebase 持久化,清除 Firebase 缓存

标签 ios objective-c firebase firebase-realtime-database persistence

我的应用使用 Firebase 来同步和恢复数据。我使用 setValue:withCompletionBlock: 方法来插入、更新和删除 Firebase 对象。只要有 CoreData 保存,就会调用此方法,从而将我所有的本地更改同步到 Firebase

- (void) setValue:(id)value withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block;

现在同步会将所有本地数据上传到 firebase,而 restore 会将本地数据替换为 firebase 数据。

- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block;

我观察 FEventTypeValue 并使用 FDataSnapshot 从 Firebase 获取数据并恢复本地数据。

所以在我将 persistence 设置为 Firebase 之前,一切都对我来说很完美。

[Firebase setOption:@"persistence" to:@YES];

现在当 persistence 开启时,当我更新时,比如说将一个对象插入 Firebase,然后恢复,插入之前的数据被恢复。即新插入的对象不会被恢复。但是,如果我再次恢复,插入的对象将被恢复。删除对象时也会发生同样的事情。删除的对象在我第一次恢复时重新出现,在我再次恢复时消失。我可以通过 Firebase 数据 View 看到 Firebase 对象已正确插入和/或删除。

我不确定我在这里做错了什么。我只有在恢复时才有问题。我认为 Firebase 缓存导致了这个恢复问题。我正在考虑在恢复之前清除 Firebase 缓存。我的问题是

  1. 在恢复之前清除缓存是一种好方法吗?
  2. 如果是,如何清除 Firebase 缓存?
  3. 如果不是,你能建议我恢复数据的最佳方法吗?

最佳答案

[注意:如果您可以选择使用 Cloud Firestore 而不是实时数据库,那么它具有更好的离线支持。当您执行 .get() 时,它会自动尝试从服务器获取最新数据,并且仅在您离线时才使用缓存数据。您还可以专门请求从服务器或缓存中检索数据。]

不幸的是,这是预期的行为。您可能可以通过使用 observeEventOfType 而不是 observeSingleEventOfType 来解决它

基本上,无论何时观察数据,我们都会先从持久缓存中提取数据。该数据将是我们上次从 Firebase 收到的任何数据。因为您使用的是 observeSingleEventOfType 而不是 observeEventOfType,所以您不会从 Firebase 接收定期更新,因此我们缓存的数据实际上不会包含您写入的最新数据。

作为一个简单的修复,您可以只在相关数据上添加一个 observeEventOfType。您实际上不需要对事件做任何事情。但是,如果您一直聆听它们,那么您的应用将从 firebase 获取最新数据,并且当您调用 observeSingleEventOfType 时,您可以确信它会缓存最新数据。

关于ios - Firebase 持久化,清除 Firebase 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416541/

相关文章:

ios - 在 Metal 计算着色器中使用MPSImageConvolution内核

ios - 返回 Root View Controller

node.js - 函数正在循环

javascript - 如何读取 Firebase Cloud Functions 的 index.js 中的 Firebase 数据库条目?

javascript - 将错误数据从 Firebase 或服务器响应传递给 Formik

iphone - 奇怪的 NSDate 和 NSDateFormatter 行为

ios - 如何在 Swift3 中使用 YouTube API 显示 YouTube channel 的播放列表

iphone - 将包含\u#### 的字符串转换为 iOS iPhone 上的字符

ios - 数据同时显示在两个屏幕上

iphone - 配置表格单元