2017-08-13 1 views
1

関数の補完を処理する最善の方法を見つけようとしています。firebaseが終了したときに関数に補完を追加する、iOS、Swift

この関数はfirebaseからのデータを呼び出して辞書の配列に追加します。これはマップ用であり注釈を追加するため、ループは最後に追加されたバージョンに来る前に大量のデータを追加しているため、アノテーションの投げ込み負荷が同じ場所に集中します。私はループが終了したときに補完を呼び出すことができますし、関数ShowSightings()を呼び出すことができるかどうかを知りたいです。

func getDatafromFB() { 
    DataService.ds.REF_POSTS.child("postCodes").observeSingleEvent(of: .value, with: { (snapshot) in 

     let value = snapshot.value as? NSDictionary 
     let postsIds = value?.allKeys as! [String] 
     for postId in postsIds { 
      let refToPost = Database.database().reference(withPath: "posts/" + "postCodes/" + postId) 
      refToPost.observe(.value, with: { snapshot in 
       if snapshot.exists() { 

        let postDict = snapshot.value as? [String: AnyObject] 

        print("Tony: before append post \(self.posts)") 
        self.posts.append(postDict!) 
        print("Tony: post \(self.posts)") 


       }else { 
        print("Tony: Couldn't get the data") 
       } 
      }) 
     } 
     print("Tony: The compleetion result \(self.posts)") 
    }) 

} 

答えて

1

あなたはこれを試すことができます。

func doAsyncTask(completionHandler:@escaping (Bool) ->()){ 
//do async tasks 
completionHandler(true) //<- call this when the data is retrieved 
//so in your case, see below 
} 

override func viewDidLoad{ 
    doAsyncTask(){ succes in 
    //succes gives true or false 
    } 
} 

//your case 
}else { 
    print("Tony: Couldn't get the data") 
} 
completionHandler(true) //<- right there 

これは、1つの非同期タスクのためです。私はあなたが複数の非同期タスクを使用したいと思う。これはディスパッチグループの仕事です。私はパラメータを取るために私の機能のいくつかを変更します。これをチェックしてください:

+0

ありがとうございますこの@ j.Doe、ImはFirebaseから辞書の配列を作成しようとしています。 post [[string:Any]]()のように設定されている投稿にそれらを修正している瞬間、postsIDの各postIDが投稿に費やしています。 arrPostIdsに何を追加しますか?それはポストですか? –

+0

これをうなずき、編集して自分のコードに適用することができました –

関連する問題