iOS複数のネットワーク要求並列/同時処理
必要:
解決方法:
分析:まずパラレルキューを作成し、キューグループを作成し、キューと処理するネットワーク要求をそれぞれグループに追加し、グループ内のすべてのキューがイベントを処理した後にdispatch_を呼び出す.group_notify、私たちは中で事件Eを処理する必要があります.キューは、ネットワーク要求の処理時に「1つの要求の送信が完了した」ことをイベント完了のフラグとする(この場合、ネットワーク要求の戻りデータはまだ取得されていない)ため、ここでは信号量を制御してdispatch_group_notifyを実行する前に信号待ちを開始する必要がある(4回の信号待ち、それぞれ各キューの信号通知に対応)は、各キューがネットワーク要求戻りデータを取得したときに信号通知を発行する.これにより、需要中の要求を完了する.
A,B,C,Dの4つのタスクが同時に存在する場合、ABCDに順次処理を要求し、前のタスクが完了した場合に次のタスクを行い、4つのタスクが完了した場合にイベントEを処理する.この場合はキューをシリアルキューに変更するだけでよい(信号量制御は不要).
A,B,C,D , , E。
解決方法:
/ /
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
/ /
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@" A");
for (int i = 0; i<10000; i++) {
NSLog(@" i %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{
NSLog(@" B");
for (int i = 0; i<10000; i++) {
NSLog(@" j %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{
NSLog(@" C");
for (int i = 0; i<10000; i++) {
NSLog(@" k %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{
NSLog(@" D");
for (int i = 0; i<10000; i++) {
NSLog(@" l %d",i);
}
dispatch_semaphore_signal(semaphore);
});
dispatch_group_notify(group, queue, ^{
/ /
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@" E");
});
分析:まずパラレルキューを作成し、キューグループを作成し、キューと処理するネットワーク要求をそれぞれグループに追加し、グループ内のすべてのキューがイベントを処理した後にdispatch_を呼び出す.group_notify、私たちは中で事件Eを処理する必要があります.キューは、ネットワーク要求の処理時に「1つの要求の送信が完了した」ことをイベント完了のフラグとする(この場合、ネットワーク要求の戻りデータはまだ取得されていない)ため、ここでは信号量を制御してdispatch_group_notifyを実行する前に信号待ちを開始する必要がある(4回の信号待ち、それぞれ各キューの信号通知に対応)は、各キューがネットワーク要求戻りデータを取得したときに信号通知を発行する.これにより、需要中の要求を完了する.
A,B,C,Dの4つのタスクが同時に存在する場合、ABCDに順次処理を要求し、前のタスクが完了した場合に次のタスクを行い、4つのタスクが完了した場合にイベントEを処理する.この場合はキューをシリアルキューに変更するだけでよい(信号量制御は不要).