iOS系统GCD学习(3):dispatch_group

转载 2013年12月04日 13:29:14

设想下面的循环:

  1. for(id obj in array)  
  2.     [self doSomethingIntensiveWith:obj];  

  假定 -doSomethingIntensiveWith: 是线程安全的且可以同时执行多个.一个array通常包含多个元素,这样的话,我们可以很简单地使用GCD来平行运算:

  1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2. for(id obj in array)  
  3.     dispatch_async(queue, ^{  
  4.         [self doSomethingIntensiveWith:obj];  
  5.     });  

  如此简单,我们已经在多核心上运行这段代码了。

  当然这段代码并不完美。有时候我们有一段代码要像这样操作一个数组,但是在操作完成后,我们还需要对操作结果进行其他操作:

  1. for(id obj in array)  
  2.      [self doSomethingIntensiveWith:obj];  
  3.  [self doSomethingWith:array];  

  这时候使用GCD的 dispatch_async 就悲剧了.我们还不能简单地使用dispatch_sync来解决这个问题, 因为这将导致每个迭代器阻塞,就完全破坏了平行计算。

  解决这个问题的一种方法是使用dispatch group。一个dispatch group可以用来将多个block组成一组以监测这些Block全部完成或者等待全部完成时发出的消息。使用函数dispatch_group_create来创建,然后使用函数dispatch_group_async来将block提交至一个dispatch queue,同时将它们添加至一个组。所以我们现在可以重新代码:

  1. dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2. dispatch_group_t group = dispatch_group_create();  
  3. for(id obj in array)  
  4.     dispatch_group_async(group, queue, ^{  
  5.         [self doSomethingIntensiveWith:obj];  
  6.     });  
  7. dispatch_group_wait(group, DISPATCH_TIME_FOREVER);  
  8. dispatch_release(group);  


  [self doSomethingWith:array];如果这些工作可以异步执行,那么我们可以更风骚一点,将函数-doSomethingWith:放在后台执行。我们使用dispatch_group_async函数建立一个block在组完成后执行:


  1. dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2.   dispatch_group_t group = dispatch_group_create();  
  3.   for(id obj in array)  
  4.       dispatch_group_async(group, queue, ^{  
  5.           [self doSomethingIntensiveWith:obj];  
  6.       });  
  7.   //等group里的task都执行完后执行notify方法里的内容,相当于把wait方法及之后要执行的代码合到一起了  
  8.   dispatch_group_notify(group, queue, ^{  
  9.       [self doSomethingWith:array];  
  10.   });  


  dispatch_release(group);不仅所有数组元素都会被平行操作,后续的操作也会异步执行,并且这些异步运算都会将程序的其他部分考虑在内。注意如果-doSomethingWith:需要在主线程中执行,比如操作GUI,那么我们只要将main queue而非全局队列传给dispatch_group_notify函数就行了。

  还有一段演示dispatch_group的代码:

  1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   
  2. dispatch_group_t group = dispatch_group_create();   
  3. dispatch_group_async(group, queue, ^{   
  4.     [NSThread sleepForTimeInterval:1];   
  5.     NSLog(@"group1");   
  6. });   
  7. dispatch_group_async(group, queue, ^{   
  8.     [NSThread sleepForTimeInterval:2];   
  9.     NSLog(@"group2");   
  10. });   
  11. dispatch_group_async(group, queue, ^{   
  12.     [NSThread sleepForTimeInterval:3];   
  13.     NSLog(@"group3");   
  14. });   
  15. dispatch_group_notify(group, dispatch_get_main_queue(), ^{   
  16.     NSLog(@"updateUi");   
  17. });  

GCD 信号量控制并发(dispatch_semaphore)以及dispatch_group_async

1、dispatch_semaphore 当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢? ...
  • wlm0813
  • wlm0813
  • 2016年09月03日 13:52
  • 1455

GCD入门介绍四---- dispatch_group_async和dispatch_barrier_async

我们在开发的过程中,可能碰到如下的情况: 1.异步下载两张图片,然后合并成一张图片。 2....
  • jasonjwl
  • jasonjwl
  • 2016年01月30日 20:40
  • 1223

iOS 开发之多线程 (GCD与NSOperation)详解

本文转自:http://dev.dafan.info/detail/226124?p=18 概述 何为多线程? 多线程其实针对单核的CPU来设计的,CPPU同一时间只能执行一...
  • Xia0Liang
  • Xia0Liang
  • 2017年04月19日 11:37
  • 924

iOS dispatch_group的使用

/** * 使用dispatch_group,异步多请求 */ - (void)asyncBaseData { // 全局串行队列 dispatch_queue_t global...
  • yaoliangjun306
  • yaoliangjun306
  • 2016年05月20日 16:02
  • 3823

GCD 学习(四) dispatch_group

如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,可以把该操作放到最后一个任务执行完成后继续,但是在并行队列中怎么做呢。这就有dispatch_group 成组操作...
  • HookyStudent
  • HookyStudent
  • 2015年04月03日 15:45
  • 231

iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)

Dispatch Group 在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现。如果只是使用一个Serial Dispatch Queue(串行队列)时...
  • liuyinghui523
  • liuyinghui523
  • 2016年02月01日 13:24
  • 4504

完整详解swift GCD系列(三)dispatch_group

原创Blog,转载请注明出处 http://blog.csdn.net/column/details/swift-gcd.html 一、dispatch_group 把一组任务提交到队列中,这些...
  • ruglcc
  • ruglcc
  • 2016年12月12日 16:52
  • 944

iOS GCD 和信号量 实现 生产者和消费者模式

GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。 一、dispatch组(dispatch group) 1. 创建dispatch组 dispatch...
  • jeffasd
  • jeffasd
  • 2016年01月11日 11:36
  • 2837

GCD 中组队列group与Afnetworking的结合使用

学了GCD以后,对所讲解的概念都有所了解了,但是对于group创建组队列,在组队列中是正确的使用AFnetworking发送网络请求。 下面分别来说一下吧。 第一种情况,对某一个url多次请求的情...
  • HHL110120
  • HHL110120
  • 2016年05月16日 11:12
  • 2544

完整详解GCD系列(三)dispatch_group

完整详解GCD系列三,详细的阐述了dispatch_group的常用方法,通过实例解析如何使用。并且实例解析了dispatch_group_enter/dispatch_group_leave。提供了...
  • Hello_Hwc
  • Hello_Hwc
  • 2014年11月23日 11:23
  • 6864
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS系统GCD学习(3):dispatch_group
举报原因:
原因补充:

(最多只允许输入30个字)