Firebase持久性,清除Firebase缓存

时间:2014-06-25 19:02:55

标签: 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数据视图正确插入和/或删除了Firebase对象。

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

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

2 个答案:

答案 0 :(得分:26)

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

这是不幸的预期行为。您可以使用observeEventOfType而不是observeSingleEventOfType

来解决它

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

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

答案 1 :(得分:0)

您可以使用display:none标志来检查该值是否来自缓存。请注意,如果缓存值与服务器中的值匹配,则除非您添加下面显示的snap.metadata.fromCache标志,否则不会触发onSnapshot两次,相反,它将仅使用includeMetadataChanges标志将其触发一次设置为metadata.fromCache

true