2017-11-28 24 views
1

私は補完ハンドラを持つ関数を持っていますが、関数Imでは2つの別々の非同期呼び出しがあります。ディスパッチキューを複数の非同期呼び出しで使用する

それのための擬似のようです:

func Foo(completion:()->()) { 
let dispatchGroup = DispatchGroup() 

for doc in documents { 
    dispatchGroup.enter() 
    ref.getDocument(completion: { (snapshot, error) in 
     //Need another getDocument call here 
     let Object = Object(init with snapshot data) 
     dispatchGroup.leave() 
    } 
    } 
    } completion() 

は、私は何をする必要があることは、私がコメントを追加しました別の非同期呼び出しを追加しています。以下のようなコードを見てになるだろう

ref.getDocument(completion: { (snapshot, error) in 
      userCountRef.getDocuments(completion: { (snap, error) in 
      let Object = Object(init with snapshot data) 
      dispatchGroup.leave() 
      } 
     } completion() 

コードの第二セットの問題は、最初のループのための私の通過した後、私の完了ハンドラが呼び出されるということです。

私が探しているのは、ディスパッチグループで2組の非同期呼び出しを処理できるようにすることです。最初の呼び出しが必要で、最初の呼び出しで情報を使用して2番目の呼び出しを作成し、最後にクラスオブジェクトを作成し、完全にすすぎ、繰り返してループし、次に非常に終了は私の完了を呼び出します。

これはどのように達成できますか?第二非同期呼び出しは、最初に依存しますが、それ以外の最初のデータがref内の他のオブジェクトから呼び出すない場合

答えて

2

、これは動作するはずです:このnotifyは、すべてのenter年代が持っていることを保証します

func Foo(completion:()->()) { 
    let dispatchGroup = DispatchGroup() 

    for doc in documents { 
    dispatchGroup.enter() 
    ref.getDocument(completion: { (snapshot, error) in 
     userCountRef.getDocuments(completion: { (snap, error) in 
      let Object = Object(init with snapshot data) 
      dispatchGroup.leave() 
     } 
    } 
    } 

    // .main here is the main DispatchQueue. Can be any queue desired 
    dispatchGroup.notify(.main) { 
    completion() 
    } 
} 

あなたのcompletionに電話する前に、終了leaveと一致しました。アップルのdocs hereをご覧ください。

+1

私はこれまでに正確にこれをやろうとしていましたが、ちょうど私の括弧が少しうんざりしていました..助けてくれてありがとう。 – Noowoo

関連する問題