2012-08-16 72 views
14

我正在構建一個使用Firebase的Web應用程序,它採用相同的數據並以兩種不同的方式將其呈現在列表中,並作爲Google地圖上的標記。Firebase - 緩存是否可以提高性能?

現在,在每個視圖中 - 地圖或列表 - 我有代碼來查詢來自Firebase的數據,將它合併在一起並顯示出來。相反,我正在考慮這個計劃:在啓動時,查詢數據,合併它,並將其全部保存到從視圖傳遞到數組中的數組中。

從某種意義上說,我是在數組中緩存firebase數據。從某種意義上說,這並不理想 - 緩存數據不像直接查詢Firebase那樣最新。另一方面,我只調用一次Firebase。

這是否使性能感?從Firebase中讀取數據的時間與從數組中讀取數據的時間相同嗎?

回答

21

通常,緩存數據以限制Firebase的使用是不必要的。 Firebase在客戶端維護自己的「活動」數據緩存。 「主動」被定義爲其上有「開啓」呼叫的數據。因此,對於任何活動數據,由於數據已被加載,所以任何附加的「開」或「一次」呼叫都不需要網絡通信量。

我不完全確定你的意思是「查詢firebase」。 Firebase沒有傳統意義上的查詢。它只是具有附加回調的方法。您是否使用「once()」函數定期從Firebase獲取數據?如果是這樣,這可能是非常低效的。一旦是一種方便的方法,一般只應用於極少訪問的數據,或者由於某種原因,開發人員不希望實時更新。如果在once()完成時沒有活動的「on」調用未完成,Firebase將刷新該數據的緩存,並且任何後續調用once()都將需要往返服務器。

如果你想要的是一種有效的方式同步訪問的數據的最新版本的本地拷貝的方式,我建議這個方法:

var savedSnapshot = null; 
dataRef.on("value", function(snapshot) { 
    savedSnapshot = snapshot; 
}); 

//and then when you need to read the data 
var theData = savedSnapshot.val() 

通過保持()調用一個單一的, Firebase可以在事情發生變化時僅通過電匯發送增量,而不是每次需要時重新加載所有數據,從而使數據保持最新狀態。

+1

很好的解釋。文檔,順便說一句,給出了這個印象,但沒有深入細節(這可能是文檔的一個很好的附錄) – Kato 2012-08-16 18:06:57

+1

我們打算在不久的將來爲文檔添加一些性能部分。 – 2012-08-16 21:18:16

+0

@AndrewLee會不會寫這個表演部分?我已經使用了Firebase 2年了,並沒有像這個(5年前)答案中所說的那樣「完全」點擊,而是解釋瞭如何將數據快照存儲起來以備後用。我現在意識到,我已經進行了很多防守編碼,擔心不知道Firebase是做什麼的,並且不會在內部「緩存」。我現在看到,DataSnapshot只是一個可導向內部不可變數據結構的導航遊標,並且'val()'將其數據克隆到POJO中。這是如此優雅的設計!帽子關:-) – skrebbel 2017-01-25 12:53:29