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

 

 

 

posted @ 2014-04-28 14:45  ygm900  阅读(10247)  评论(0编辑  收藏  举报