iOS複数のネットワーク要求並列/同時処理


必要:
    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を処理する.この場合はキューをシリアルキューに変更するだけでよい(信号量制御は不要).