iOS GCD中的dispatch_group
假如有一组任务,A,B,C,D,其中ABC是可以并行的,D是必须在ABC任务完成后再执行的。
(举个场景,比如吃饭前必须先做菜、做饭和买饮料,然后才能开吃)
1.关于ABC的并行:
采用多线程的方式就能实现。比如NSThread,NSOperation或是GCD.
2.然后关于ABC完成再执行D:
A方法:
这可以采用操作系统里临界资源的概念:
设立一个标志位flag,其值为任务数量,每个任务执行后flag--,并且每次任务的执行都要判断flag,为0时执行D。
B方法:
然而在GCD中有一个接口可以直接完成类似操作,就是GCD_Group,其中的重点就是把各个Queue加到Group里,然后
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
具体的操作方式如下:
-(void)GCDTask{
NSArray *array =@[@"TaskA",@"TaskB",@"TaskC"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_group_t group = dispatch_group_create();
for(id obj in array)
dispatch_group_async(group, queue, ^{
[self doSomethingIntensiveWith:obj];
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
[self doSomethingIntensiveWith:@"TaskD"];
}
-(void)doSomethingIntensiveWith:(NSString *)str{
NSLog(@"%@",str);
}
dispatch_group_wait()函数会一直等到前面Group中的内容执行完再执行下面内容,但因此也会产生阻塞线程的问题,可以考虑使用另一个函数:
//等group里的task都执行完后执行notify方法里的内容
dispatch_group_notify(group, queue, ^{
[self doSomethingIntensiveWith:@"TaskD"];
});
具体如下:
-(void)GCDTask{
NSArray *array =@[@"TaskA",@"TaskB",@"TaskC"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_group_t group = dispatch_group_create();
for(id obj in array)
dispatch_group_async(group, queue, ^{
[self doSomethingIntensiveWith:obj];
});
//等group里的task都执行完后执行notify方法里的内容
dispatch_group_notify(group, queue, ^{
[self doSomethingIntensiveWith:@"TaskD"];
});
[self doSomethingIntensiveWith:@"TaskE"];
}
-(void)doSomethingIntensiveWith:(NSString *)str{
NSLog(@"%@",str);
}
这样就不会应该线程阻塞了。
另外,如果需要在Notify里回到主线程进行UI操作,可以修改成:
//等group里的task都执行完后执行notify方法里的内容
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//..do something with UI
[self doSomethingIntensiveWith:@"TaskD"];
});
iOS GCD中的dispatch_group的更多相关文章
- GCD中的dispatch_group函数的详解
<一>引入dispatch_group函数的目的 在追加到dispatch_Queue中的多个处理全部结束后想要执行结束的处理,这种需求经常会在我们的程序中出现 (第一种情况)只使用一个S ...
- iOS GCD中级篇 - dispatch_group
1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2 ...
- iOS GCD中级篇 - dispatch_group的理解及使用
上一篇GCD基础篇,以及同步.异步,并发.并行几个概率的理解 关于dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相 ...
- iOS GCD基础篇 - 同步、异步,并发、并行的理解
1.关于GCD - GCD全称是Grand Central Dispatch - GCD是苹果公司为多核的并行运算提出的解决方案 - GCD会自动利用更多的CPU内核(比如双核.四核) - GC ...
- iOS开发中GCD在多线程方面的理解
GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...
- iOS 关于GCD中的队列
GCD中队列分类及获得方式 1.串行队列 dispatch_queue_t queue = dispatch_queue_create("队列名", DISPATCH_QUEUE ...
- iOS:对GCD中 同步、异步、并行、串行的见解
1.GCD-同步执行多线程时 GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程). 2.GCD-异步执行多线程时 GCD中不管向什么类 ...
- iOS开发RunnLoop学习二:GCD中的定时器
#import "ViewController.h" @interface ViewController () /** 注释 */ @property (nonatomic, st ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
随机推荐
- IO(一)----字节流
File类是文件的抽象表示,如果要对文件的内容进行读写就需要使用IO流技术. IO流简介:(Input/Output) I/O类库中使用"流"这个抽象概念.Java对设备中数据的操 ...
- QTableView 一列添加两个按钮
在QTableView的一列里添加两个按钮,之前添加一个按钮的思路是一样的,只是计算了一下按钮的宽,放两个按钮而已. 添加一个按钮的例子:QTableView 添加按钮 本例源代码:QtTowButt ...
- Http概述(一)
Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱. 这样用户在访问信息时就不用担心其完整性了. web服务端与服务器是如何通信的 Web ...
- 从Hadoop Summit 2016看大数据行业与Hadoop的发展
前言: 好吧我承认已经有四年多没有更新博客了.... 在这四年中发生了很多事情,换了工作,换了工作的方向.在工作的第一年的时候接触机器学习,从那之后的一年非常狂热的学习机器学习的相关技术,也写了一些自 ...
- 从炉石传说的一个自杀OTK说起
OTK就是one turn kill,不过这次我们要谈的OTK是自杀,对就是自己把自己给OTK了. 其实程序没有任何错误,只是恰巧碰上了这么个死循环. ps:文章最后有代码git地址 发动条件及效果: ...
- <button>属性,居然才发现
今天学习了一个表单验证的程序,发现点了一个<botton>之后,表单里面的所有输入框的内容,统统都消失了,后来一查看源代码,我发现居然是<botton>里面的属性如下: < ...
- MySQL 5.7.9版本sql_mode=only_full_group_by问题
用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT l ...
- C#开发命名规范
学习C#之初,始终不知道怎么命名比较好,很多时候无从命名,终于有一天我整理了一份命名规范文档,自此我就是按照这个命名规范书写代码,整洁度无可言表,拙劣之处请大家斧正,愚某虚心接受,如有雷同,不胜荣幸 ...
- ViewPager
1.ViewPager的功能为实现视图滑动 在主布局里边加入: <android.support.v4.view.ViewPager 这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载 ...
- ASP.Net Web Form<一> aspx文件编译及呈现
对比复习下JSP 1.jsp的本质是Servlet ,会在第一次被访问时会被翻译成一个类文件,从此对这个页面的访问都是由这个类文件执行后进行输出. aspx 本质是IHttpHandler 2.jsp ...