dispatch_group_async 使用詳解


dispatch_group_async可以實現監聽一組任務是否完成,完成后得到通知執行其他的操作。這個方法很有用,比如你執行三個下載任務,當三個任務都下載完成后你才通知界面說完成的了。下面是一段例子代碼:

  1. [cpp]
  2. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
  3. dispatch_group_t group = dispatch_group_create(); 
  4. dispatch_group_async(group, queue, ^{ 
  5. [NSThread sleepForTimeInterval:1]; 
  6. NSLog(@"group1"); 
  7. }); 
  8. dispatch_group_async(group, queue, ^{ 
  9. [NSThread sleepForTimeInterval:2]; 
  10. NSLog(@"group2"); 
  11. }); 
  12. dispatch_group_async(group, queue, ^{ 
  13. [NSThread sleepForTimeInterval:3]; 
  14. NSLog(@"group3"); 
  15. }); 
  16. dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
  17. NSLog(@"updateUi"); 
  18. }); 
  19. dispatch_release(group); 
  20. dispatch_group_async是異步的方法,運行后可以看到打印結果:
  21. 2012-09-25 16:04:16.737 **Test[43328:11303] group1
  22. 2012-09-25 16:04:17.738 **Test[43328:12a1b] group2
  23. 2012-09-25 16:04:18.738 **Test[43328:13003] group3
  24. 2012-09-25 16:04:18.739 **Test[43328:f803] updateUi
復制代碼

每個一秒打印一個,當第三個任務執行后,upadteUi被打印。3、dispatch_barrier_async的使用

dispatch_barrier_async是在前面的任務執行結束后它才執行,而且它后面的任務等它執行完成之后才會執行


例子代碼如下:

  1. [cpp] 
  2. dispatch_queue_t queue = dispatch_queue_create("**test.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT); 
  3. dispatch_async(queue, ^{ 
  4. [NSThread sleepForTimeInterval:2]; 
  5. NSLog(@"dispatch_async1"); 
  6. }); 
  7. dispatch_async(queue, ^{ 
  8. [NSThread sleepForTimeInterval:4]; 
  9. NSLog(@"dispatch_async2"); 
  10. }); 
  11. dispatch_barrier_async(queue, ^{ 
  12. NSLog(@"dispatch_barrier_async"); 
  13. [NSThread sleepForTimeInterval:4]; 
  14. }); 
  15. dispatch_async(queue, ^{ 
  16. [NSThread sleepForTimeInterval:1]; 
  17. NSLog(@"dispatch_async3"); 
  18. });
復制代碼

打印結果:

2012-09-25 16:20:33.967 **Test[45547:11203] dispatch_async1
2012-09-25 16:20:35.967 **Test[45547:11303] dispatch_async2
2012-09-25 16:20:35.967 **Test[45547:11303] dispatch_barrier_async
2012-09-25 16:20:40.970 **Test[45547:11303] dispatch_async3
請注意執行的時間,可以看到執行的順序如上所述。


4、dispatch_apply
執行某個代碼片段N次。

  1. dispatch_apply(5, globalQ, ^(size_t index) {
  2. // 執行5次
  3. });
復制代碼


原文鏈接:http://www.2cto.com/kf/201209/157722.html

 

 

點擊返回按鈕以后,取消gcd子線程

dispatch_suspend(downloadNewsQueue);
dispatch_release(downloadNewsQueue);
downloadNewsQueue=nil;

注意:gcd在使用時,也要判斷一下downloadNewsQueue是否為nil

參考:http://www.cocoachina.com/bbs/simple/?t129464.html

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM