我的应用使用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缓存。我的问题是
答案 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