1. 程式人生 > >iOS 多個網路請求並行/併發處理

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"); });
  • 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。這時只需要將佇列改為序列佇列即可(不在需要訊號量控制)。