GCD多執行緒之多工併發等待所有任務完成
阿新 • • 發佈:2019-01-03
在實際專案中我們經常會遇到,發出多個網路請求,然後等待所有結果都返回後,再進行下一步操作的需求。那麼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); }); } }