1. 程式人生 > >GCD多執行緒之多工併發等待所有任務完成

GCD多執行緒之多工併發等待所有任務完成

在實際專案中我們經常會遇到,發出多個網路請求,然後等待所有結果都返回後,再進行下一步操作的需求。那麼GCD完美的解決了這個樣的需求。

第一種方式:

    //建立佇列組
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        sleep(1);
        NSLog(@"任務 1");
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        sleep(2);
        NSLog(@"任務 2");
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        NSLog(@"任務 3");
    });

    //當所有的任務都完成後會發送這個通知
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"GCD_1 三個任務全部完成");
    });
}

方式二:

- (void)p_loadGCD_2 {
    //建立佇列組
    dispatch_group_t group = dispatch_group_create();

    //進入這個組
    dispatch_group_enter(group);
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        sleep(1);
        NSLog(@"任務 1");
        //這個組的任務完成時離開
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        sleep(2);
        NSLog(@"任務 2");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        NSLog(@"任務 3");
        dispatch_group_leave(group);
    });

    //當所有的任務都完成後會發送這個通知
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"GCD_2 三個任務全部完成");
    });
}

方式三:

- (void)p_loadGCD_3 {
    //建立一個佇列組
    dispatch_group_t group = dispatch_group_create();
    //建立一個訊號量總數為10的semaphore
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);

    for (NSInteger i = 0; i < 10; ++i) {
        //等待訊號,當訊號總量小於0的時候就會一直等待,否則就繼續執行,並讓訊號總量-1。
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, dispatch_get_main_queue(), ^{
            NSLog(@"任務 %ld", (long)i);
            sleep(2);
            //完成一個任務,傳送一個訊號,會讓訊號總量加1
            dispatch_semaphore_signal(semaphore);
        });
    }
}