2017-06-17 40 views
1

我的Firebase用例與大多數用戶略有不同。我們不使用FB專門用於我們的後端。我們有一個處理關係和所有數據的大型MariaDB服務器。Firebase數據庫 - 避免在iOS上反覆下載JSON

我們使用FB的目標是允許iOS設備上的客戶端提供其特定的數據。我們需要加載數據一次,然後監聽對這些特定數據的更改。這裏是它如何工作的一個粗略地:

  1. 主視圖控制器被加載
  2. 火力地堡已經初始化,我們聽FIRDataEventTypeChildAdded。 (持續性已啓用)
  3. Firebase加載所有匹配的記錄。然後我們遍歷並將它們本地存儲在內部SQLite數據庫中。

在正常的用戶流中,我們在屏幕上推送其他ViewControllers。問題是,一旦加載了主ViewController,FIRDataEventTypeChildAdded會爲每條記錄再次觸發。

問題:

  1. 當FIRDataEventTypeChildAdded再次開火,它是由加載其內部緩存(持久性?)的數據,或者它重新下載從服務器火力地堡的一切?我使用Network Link Conditioner完全切斷了互聯網連接,當我這樣做時,它根本不觸發FIRDataEventTypeChildAdded,但一旦網絡返回,它就會爲每條記錄觸發FIRDataEventTypeChildAdded。
  2. 我怎樣才能實現上述加載登錄的所有記錄,然後只聽取這些記錄的變化?我已經使用orderBy和startingAt所以如果答案涉及上述之一,我不能添加另一個「hasDownloaded = yes」過濾器。

在此先感謝。

+0

請分享您正在測試的代碼。沒有這個,很難說具體的東西。另請參閱[創建MCVE](http://stackoverflow.com/help/mcve)。 –

+0

在這種情況下,代碼無關緊要。問題在於Firebase在幕後工作的方式沒有明確的定義。 爲了簡單起見,我在我的主ViewController中有一個ChildAdded和ChildChanged偵聽器: 請重新閱讀我上面的問題,因爲它涉及瞭解每次裝入VC時是否從服務器下載JSON,或者如果它從本地緩存中獲取它,但仍然觸發ChildAdded偵聽器。 – Adam

+0

目前還不清楚在這裏沒有看到你的viewController和Firebase是如何在代碼中實現的。即每次VC被加載*都高度依賴於VC內的代碼。 .childAdded事件有意設計爲每個孩子啓動一個,然後添加任何其他孩子。它會觸發重新連接後添加的任何新的子項,但是,它依賴於您的實施。 – Jay

回答

0

Firebase參考偵聽器連接到服務器一次,並保持連接狀態直到該查詢被關閉。只要正在偵聽的引用位於內存中,就只有一個連接到數據庫。一旦發生這種連接,所有數據將作爲子添加數據再次發生。

這裏的問題與Firebase沒什麼關係,但是您的應用不斷地將偵聽器讀取到引用中,使得數據每次都從網絡中重新下載。

所以,對於你的第一個問題,是的,它是從網絡redownloading。對於您而言,您只需確保Firebase查詢不會留下內存。這可以通過使查詢在全局範圍內完成,或者只需在視圖控制器退出範圍時不關閉查詢(然後您需要確保不會在隨後的加載中讀取多個查詢)即可完成。