Firebase持久性,清除Firebase缓存

Tha*_*hir 30 persistence objective-c ios firebase firebase-realtime-database

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

- (void) setValue:(id)value withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block;
Run Code Online (Sandbox Code Playgroud)

现在同步将所有本地数据上传到firebase,而restore则使用firebase数据替换本地数据.

- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block;
Run Code Online (Sandbox Code Playgroud)

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

所以一切都适合我,直到我开始persistence使用Firebase.

[Firebase setOption:@"persistence" to:@YES];
Run Code Online (Sandbox Code Playgroud)

现在persistence,当我打开时,当我更新时,比如将对象插入Firebase,然后恢复,恢复插入前的数据.即没有恢复新插入的对象.但是,如果我再次恢复,则会恢复插入的对象.删除对象时会发生同样的事情.当我第一次恢复时,删除的对象重新出现,当我再次恢复时,删除的对象消失.我可以看到通过Firebase数据视图正确插入和/或删除了Firebase对象.

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

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

Mic*_*uer 26

不幸的是,这是当前测试版本的磁盘持久性的预期行为.您可以使用observeEventOfType而不是observeSingleEventOfType来解决它

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

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

这有点hacky,我们打算在以非beta形式发布持久性功能之前简化此API.对不起,痛苦!

  • 这仍然是这样吗?这似乎是因为我遇到了这个问题.检查用户名是否存在,如果不存在,则创建用户.如果用户注销并尝试使用相同的用户名创建新用户,则它将起作用,因为缓存不会更新. (9认同)
  • 我一直是Firebase的忠实粉丝.但为此,我要说实话,这是一个很大的限制.Firebase应该在方法`fetchNewData:Bool`中添加一个新参数.预期的意外行为不是预期的行为.在很多情况下,这可能会失败,例如分页.我们大多数人在进行分页时不会对页面进行观察.value,否则上一页可能会刷新,并且分页概念本身(这是为了减少数据传输)变得无用,因为observe方法会不断刷新上一页数据,并且我们也不能使用`removeObserver` (9认同)
  • @ michael-lehenbauer你有修复的ETA吗? (8认同)
  • 我不这么认为!经过两年多的时间仍然如此! (4认同)