iOS GCD基礎篇 - 同步、異步,并發(fā)、并行的理解

轉載自:https://blog.csdn.net/amm28824/article/details/54564378

現(xiàn)在講一下dispatch_group的概念以及幾種場景下的使用
1、關于dispatch_group

把一組任務提交到隊列中,這些隊列可以不相關,然后監(jiān)聽這組任務完成的事件。

最常見的幾個方法:

  1. dispatch_group_create創(chuàng)建一個調(diào)度任務組
  2. dispatch_group_async 把一個任務異步提交到任務組里
  3. dispatch_group_enter/dispatch_group_leave 這種方式用在不使用dispatch_group_async來提交任務,且必須配合使用
    4.dispatch_group_notify 用來監(jiān)聽任務組事件的執(zhí)行完畢
    5.dispatch_group_wait 設置等待時間,在等待時間結束后,如果還沒有執(zhí)行完任務組,則返回。返回0代表執(zhí)行成功,非0則執(zhí)行失敗

2、實際使用場景  
場景1:

現(xiàn)在有4個任務,任務1、任務2、任務3、任務4. 任務3必須在任務2之后,任務4必須在前3個任務都執(zhí)行完成后,才能執(zhí)行,并且需要在主線程更新UI。

思路分析:

任務3必須在任務2之后,所以這兩個必須串行執(zhí)行,同時,任務2和3整體可以和任務1并行執(zhí)行,最后,任務4只能等待前3個任務全部執(zhí)行完成,才能執(zhí)行。這里就可以用group快速實現(xiàn)場景需求。

代碼實現(xiàn):

 -(void)disGroup{
  dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  dispatch_queue_t selfQuene = dispatch_queue_create("myQuene", 0);  
  dispatch_group_t group = dispatch_group_create();  
  dispatch_group_async(group, globalQuene, ^{  
     NSLog(@"run task 1");  
  });  
  dispatch_group_async(group, selfQuene, ^{  
     NSLog(@"run task 2");  
  });  
 dispatch_group_async(group, selfQuene, ^{  
     NSLog(@"run task 3");  
 });  
 dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
   NSLog(@"run task 4");   });  
}  

執(zhí)行結果如下:(結果1和結果2是一樣的,只是1和2的順序區(qū)別)


image

結果1 或

image

結果2

總結: 1和(2、3)是并行執(zhí)行關系,2、3是串行執(zhí)行關系,且3肯定在2之后,而4在(1、2、3)全部完成之后才會執(zhí)行。

2、dispatch_group_enter(group)、dispatch_group_leave(group) 何時使用

理論上講,這兩個方法其實就是:手動管理group關聯(lián)的block的運行狀態(tài)(或計數(shù)),并且使用時必須保證進入和退出group次數(shù)匹配。

所以:A和B兩種使用方式可以講是等價的

  A)  
  dispatch_group_async(group, queue, ^{   
  // 。。。   
  });   

  B)   
  dispatch_group_enter(group);  
  dispatch_async(queue, ^{  
  //。。。  
  dispatch_group_leave(group);  
  });  

所以,這種用法和直接使用dispatch_group_notify一定程度上是等價的,大家可以自己選擇使用。

場景2:

有3個異步請求任務,任務1、2、3,在3個任務全部完成之后,需要執(zhí)行任務4,用以顯示界面數(shù)據(jù)。

用 dispatch_group_enter、 dispatch_group_leave 實現(xiàn):

  -(void)disGroupEnterAndLeave{  
  dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  dispatch_group_t group = dispatch_group_create();  

  //任務1  
  dispatch_group_enter(group);  
  dispatch_async(globalQuene, ^{  
     NSLog(@"run task 1");  
     sleep(1);  
     dispatch_group_leave(group);  
  });  

  //任務2  
  dispatch_group_enter(group);  
  dispatch_async(globalQuene, ^{  
     NSLog(@"run task 2");  
     sleep(2);  
     dispatch_group_leave(group);  
  });  

  //任務3  
  dispatch_group_enter(group);  
  dispatch_async(globalQuene, ^{  
     NSLog(@"run task 3");  
     sleep(3);  
     dispatch_group_leave(group);  
  });  

  //一直等待完成  
  dispatch_group_wait(group, DISPATCH_TIME_FOREVER);  

  //任務3  
 dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
     NSLog(@"run task 4");  
  });  

  }  

執(zhí)行結果:

image

3個任務是并行執(zhí)行,且一共花費3s執(zhí)行,然后才執(zhí)行任務4。

當然,如果這樣想串行執(zhí)行3個任務,只需要把 **全局隊列 **換成 **自定義隊列 **即可。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容