iOS 多個網路請求並行/併發處理
阿新 • • 發佈:2019-02-14
需求:
同時存在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。這時只需要將佇列改為序列佇列即可(不在需要訊號量控制)。