2014-06-25 122 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