2017-10-16 85 views
0

您好,我有一個Firebase應用程序,我希望在應用程序啓動時下載我的所有數據庫。所有這些工作正常,但我想知道什麼時候下載完成。如何檢測觀察員完成Firebase

func getAllDevices(completion: @escaping (Bool) -> Void) { 
    reference.child("devices").queryOrderedByKey().observe(.childAdded) { (snapshot) in 
     if let data = snapshot.value as? [String: Any] { 
      self.sync(device: data) 
     } 
     // completion(true) 

    } 

我試着用完成處理程序,但它不好,因爲每次下載新對象時都會調用它。下載完成後有什麼方法可以收到通知嗎?

+0

要檢測所有初始孩子何時被讀取,您需要觀察'.value'事件。這裏有一個[示例Swift](https://stackoverflow.com/questions/46017039/firebase-childadded-and-activity-indicator/46018057#46018057)和JavaScript(其中相同的邏輯適用):[1](https ://stackoverflow.com/questions/19883736/how-to-discard-initial-data-in-a-firebase-db),[2](https://stackoverflow.com/questions/12850789/is-there-一種稱爲特定頁面/ 12851236#12851236),[3](https://stackoverflow.com/a/11618929)的方法。 –

+0

謝謝你的幫助。感謝你,我可以解決這個問題:)。 –

回答

1

我可以使用.value事件解決問題。我做了這樣的事情,現在工作正常。

func getAllDevices(completion: @escaping (Bool) -> Void) { 
    reference.child("devices").queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in 

     if let devices = snapshot.value as? [String: Any] { 
      for data in devices.values { 
       self.sync(device: data as! [String : Any]) 
      } 
     } 

     completion(true) 
    }