2014-06-25 40 views
27

我的应用使用Firebase同步和恢复数据。我使用setValue:withCompletionBlock:方法来插入,更新和删除Firebase对象。这种方法被称为每当有CoreData保存,从而同步我的所有本地更改火力Firebase持久性,清除Firebase缓存

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

现在同步上传的所有本地数据火力点,同时恢复与火力数据替换本地数据。

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

我观察FEventTypeValue并使用FDataSnapshot来从火力地堡数据,并恢复本地数据。

因此,一切都适用于我,直到我将persistence设置为Firebase。

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

现在,当persistence是,当我更新,说对象插入到火力地堡,然后恢复,数据恢复插入前。即新插入的对象未被恢复。但是,如果我再次恢复,插入的对象被恢复。当一个对象被删除时会发生同样的事情。当我第一次恢复时,删除的对象会再次出现,当我再次恢复时会消失。我可以看到Firebase对象是通过Firebase数据视图正确插入和/或删除的。

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

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

回答

24

这是不幸的,当前的磁盘持久性测试版发布行为。您可以通过使用observeEventOfType而不是observeSingleEventOfType来解决这个问题。基本上,无论何时您观察数据,我们都会首先从持久性缓存中提取数据。该数据将是我们上次从Firebase收到的任何数据。由于您使用的是observeSingleEventOfType而不是observeEventOfType,因此您不会从Firebase接收定期更新,因此我们缓存的数据实际上不会包含您编写的最新数据。

作为一个简单的修复方法,您可能只需在所讨论的数据上添加一个observeEventOfType即可。事实上你并不需要做任何事情。但是,如果您始终听取它们的意见,那么您的应用将从Firebase获取最新数据,并且当您调用observeSingleEventOfType时,您可以确信它会缓存最新的数据。

这有点不好意思,我们打算在以非beta形式发布持久性功能之前简化这个API。痛苦抱歉!

+7

这仍然是这种情况?这似乎是我遇到这个问题。检查用户名是否存在,如果不存在,则创建用户。如果用户注销并尝试使用相同的用户名创建新用户,则它将工作,因为缓存不会更新。 –

+6

我一直是Firebase的忠实粉丝。但为此,我必须坦白地说这是一个很大的限制。 Firebase应在方法fetchNewData:Bool中添加一个新参数。意料之中的预期行为不是预期的行为。在很多情况下,这可能会失败,例如分页。我们大多数人不会在分页时观察页面的值,否则上一页可能会刷新,而分页概念本身(这是为了减少数据传输)变得无用,因为观察方法不断刷新前一页数据,并且我们也无法使用'removeObserver' –

+0

对此有任何修正? – Relm