2つのHTTPを作成する必要がある状況がありますGETリクエストとその結果は、両方が終了した後にのみ処理されます。個々のネットワークリクエストごとに完了ハンドラーがありますが、両方のリクエストからデータがいつ取得されるかわからないため、役に立ちません。
私はGCDの経験が限られていますが、今ではSwift 3がリリースされました。複数のタスクを実行し、それらのタスクに単一の完了ハンドラーを設定する方法を理解しようとしています。私の調査によると、GCDまたはNSOperationQueueが私が探しているソリューションである可能性があります。Swift3でどのツールが仕事に適しているか、コードがどのように見えるかを誰かが提案できますか?
回答:
回答№1の13ディスパッチグループを使用して、リクエストを発行する前にグループ化し、リクエストの完了ハンドラにグループを残します。したがって、非同期要求を実行するメソッドがあり、ネットワーク要求が実行されたときに呼び出されるクロージャである完了ハンドラパラメータを指定したと仮定します。
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グループを使用し、リクエストを作成するときにグループに入り、非同期リクエストの完了ハンドラーにグループを残します。
回答№2の場合は-1
ソース: Swift 3でdispatch_after GCDを書くにはどうすればよいですか?
あなたは使うことができます 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
});