2016-09-16 3 views
4

2つのHTTP GET要求を行い、両方の処理が完了した後にその結果を処理する必要がある状況があります。個々のネットワーク要求ごとに補完ハンドラがありますが、両方の要求のデータがいつ取り出されるのか分かりません。2つのHTTPネットワーク要求を同時に行う必要があります(完了ハンドラは両方とも終了します)

私はGCDでの経験は限られていますが、Swift 3がリリースされたので、私は複数のタスクを実行する方法を理解しようとしています。私の研究は、GCDまたはNSOperationQueueが私が探している解決策であるかもしれないことを示しました。誰でもどのツールが仕事に適しているのか、Swift 3のコードがどのように見えるのかを誰でも助けてくれますか?

+0

GCDまたはNSOperqueueを使用できます。 GCD:これをチェックしてください[http://stackoverflow.com/questions/37805885/how-to-create-dispatch-queue-in-swift-3][1] – user6837640

答えて

12

あなたが要求を発行する前にグループに入る、ディスパッチグループを使用し、要求の完了ハンドラ内でグループを残す必要があります。それでは、あなたは非同期要求を行ったが、ネットワーク要求が行われたときに呼び出されます閉鎖した終了ハンドラパラメータを与え、いくつかの方法を持っていたこと、第二のために、と仮定してみましょう:

func perform(request: URLRequest, completionHandler: @escaping() -> Void) { ... } 

開始するには彼らが完了したら、これらの2つの同時要求は、あなたのような何かをしたい、通知される:

let group = DispatchGroup() 

group.enter() 
perform(request: first) { 
    group.leave() 
} 

group.enter() 
perform(request: second) { 
    group.leave() 
} 

group.notify(queue: .main) { 
    print("both done") 
} 

明らかに、perform(request:)の実装が大幅に異なる場合があります(たとえば、あなたが閉鎖に戻ってデータを渡す必要がある場合があります)、 URLSessionを使用して独自のネットワークコードを作成する場合でもパターンは同じです。 Alamofireを使用します。 GCDグループを使用し、要求を作成するときにグループに入り、グループを非同期要求の完了ハンドラに残します。

+0

group.notifyのクロージャは基本的に完了ハンドラとして機能しますかグループに追加されたタスクは両方とも終了していますか?また、グループにクロージャを入力すると、すべてのリクエストを追加するまで実行を延期することをどのように知っていますか?最初のリクエストが完了してから2番目のリクエストを追加すると、2番目のリクエストがまだ保留中であることを通知するコールがあるからです。これは一般的に問題ではありませんか? –

+0

はい、すべての 'enter'呼び出しと対応する' leave'呼び出しとのバランスがとれたときにクロージャが呼び出されます。したがって、全ての 'leave'コールが受信された後でのみ、ディスパッチグループ' notify'ブロックが呼び出されます。 – Rob

+0

私は質問の弾みを謝りますが、最初の機能がグループを離脱し、2番目の機能がグループに入る前に通知される可能性はありませんか? –

-1

出典:How do I write dispatch_after GCD in Swift 3? これにはdispatch_groupを使用できます。例えば (にObjCコード):

dispatch_group_t group = dispatch_group_create(); 

//startOperation1 
dispatch_group_enter(group); 

//finishOpeartion1 
dispatch_group_leave(group); 


//startOperation2 
dispatch_group_enter(group); 

//finishOpeartion2 
dispatch_group_leave(group); 


//Handle both operations completion 
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
//code here 
}); 
関連する問題