需求:
同時存在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");
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
分析:
首先創建並行隊列,創建隊列組,將隊列和需要處理的網絡請求分別添加到組中,當組中所有隊列處理完事件後調用dispatch_group_notify,我們需要在裏邊處理事件E。由於隊列在處理網絡請求時將”發送完一個請求”作爲事件完成的標記(此時還未獲得網絡請求返回數據),所以在這裏需要用信號量進行控制,在執行dispatch_group_notify前發起信號等待(4次信號等待,分別對應每個隊列的信號通知),在每個隊列獲取到網絡請求返回數據時發出信號通知。這樣就能完成需求中的要求。
如果需求中改爲:同時存在A,B,C,D四個任務,要求ABCD依次進行處理,當上一個完成時再進行下一個任務,當四個任務都完成時再處理事件E。這時只需要將隊列改爲串行隊列即可(不在需要信號量控制)。