/ / 2つのHTTPネットワーク要求を同時に行う必要がある(両方が終了したら完了ハンドラーを使用)-ios、swift、http、networking、grand-central-dispatch

iOS、swift、http、networking、grand-central-dispatchの2つのHTTPネットワーク要求を同時に完了する必要があります。

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
});