2017-10-16 14 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- context-child-added-called-specific-page/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) 
    } 
関連する問題