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。這時只需要將隊列改爲串行隊列即可(不在需要信號量控制)。

發佈了11 篇原創文章 · 獲贊 21 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章