dispatch_group_t 日常使用注意事项
一、背景简介
平时在进行多线程处理任务时,有时候希望多个任务之间存在着一种联系,希望在所有的任务执行完后做一些总结性处理。
那么就可以将多个任务放在一个任务组中进行统一管理。dispatch提供了相应的API供我们完成这一需求。
二、dispatch_group_t相关属性介绍
1.dispatch_group_async(group, queue, block);
将block任务添加到queue队列,并被group组管理
2.dispatch_group_enter(group);
声明dispatch_group_enter(group)下面的任务由group组管理,group组的任务数+1
3.dispatch_group_leave(group);
相应的任务执行完成,group组的任务数-1
4.dispatch_group_create();
创建一个group组
5.dispatch_group_wait(group1, DISPATCH_TIME_FOREVER);
当前线程暂停,等待dispatch_group_wait(group1, DISPATCH_TIME_FOREVER)上面的任务执行完成后,线程才继续执行。
6.dispatch_group_notify(group1, queue1,block);
监听group组中任务的完成状态,当所有的任务都执行完成后,触发block块,执行总结性处理。
三、常见用法的区别
在使用group组处理任务时,常见的有两种组合。
其一:
dispatch_group_async(group, queue, block);
dispatch_group_notify(group1, queue1, block);
在这种组合下,根据任务是同步、异步又分为两种,这两种组合的执行代码与运行结果如下:
第一种:同步任务时
dispatch_queue_t queue1 = dispatch_queue_create("dispatchGroupMethod1.queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group1 = dispatch_group_create(); dispatch_group_async(group1, queue1, ^{
dispatch_sync(queue1, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i); }
});
}); dispatch_group_async(group1, queue1, ^{
dispatch_sync(queue1, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i); }
});
}); // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
// dispatch_group_wait(group1, DISPATCH_TIME_FOREVER); //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
dispatch_group_notify(group1, queue1, ^{
NSLog(@"Method1-全部任务执行完成");
});
同步任务运行结果:
-- ::05.883 MyTestWorkProduct[:] 任务1-同步任务执行-:
-- ::05.884 MyTestWorkProduct[:] 任务1-同步任务执行-:
-- ::06.885 MyTestWorkProduct[:] 任务1-同步任务执行-:
-- ::06.885 MyTestWorkProduct[:] 任务1-同步任务执行-:
-- ::07.886 MyTestWorkProduct[:] 任务1-同步任务执行-:
-- ::07.886 MyTestWorkProduct[:] 任务1-同步任务执行-:
-- ::07.886 MyTestWorkProduct[:] Method1-全部任务执行完成
第二种:异步任务时
dispatch_queue_t queue1 = dispatch_queue_create("dispatchGroupMethod1.queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group1 = dispatch_group_create(); dispatch_group_async(group1, queue1, ^{
dispatch_async(queue1, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-异步任务执行-:%ld",@"任务1",(long)i); }
});
}); dispatch_group_async(group1, queue1, ^{
dispatch_async(queue1, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-异步任务执行-:%ld",@"任务2",(long)i); }
});
}); // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
// dispatch_group_wait(group1, DISPATCH_TIME_FOREVER); //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
dispatch_group_notify(group1, queue1, ^{
NSLog(@"Method1-全部任务执行完成");
});
异步任务运行结果:
-- ::28.889 MyTestWorkProduct[:] Method1-全部任务执行完成
-- ::29.893 MyTestWorkProduct[:] 任务2-异步任务执行-:
-- ::29.893 MyTestWorkProduct[:] 任务1-异步任务执行-:
-- ::30.896 MyTestWorkProduct[:] 任务2-异步任务执行-:
-- ::30.896 MyTestWorkProduct[:] 任务1-异步任务执行-:
-- ::31.901 MyTestWorkProduct[:] 任务2-异步任务执行-:
-- ::31.901 MyTestWorkProduct[:] 任务1-异步任务执行-:
结论:dispatch_group_async(group, queue, block) 和 dispatch_group_notify(group1, queue1, block) 组合在执行同步任务时正常,在执行异步任务时不正常。
其二
dispatch_group_enter(group);
dispatch_group_leave(group);
dispatch_group_notify(group1, queue1,block);
在这种组合下,根据任务是同步、异步又分为两种,这两种组合的执行代码与运行结果如下:
第一种:同步任务时
dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group2 = dispatch_group_create(); dispatch_group_enter(group2);
dispatch_sync(queue2, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i); }
dispatch_group_leave(group2);
}); dispatch_group_enter(group2);
dispatch_sync(queue2, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i); }
dispatch_group_leave(group2);
}); // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
// dispatch_group_wait(group2, DISPATCH_TIME_FOREVER); //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
dispatch_group_notify(group2, queue2, ^{
NSLog(@"Method2-全部任务执行完成");
});
同步任务执行结果:
-- ::05.884 MyTestWorkProduct[:] 任务2-同步任务执行-:
-- ::06.885 MyTestWorkProduct[:] 任务2-同步任务执行-:
-- ::07.886 MyTestWorkProduct[:] 任务2-同步任务执行-:
-- ::08.887 MyTestWorkProduct[:] 任务2-同步任务执行-:
-- ::09.888 MyTestWorkProduct[:] 任务2-同步任务执行-:
-- ::10.889 MyTestWorkProduct[:] 任务2-同步任务执行-:
-- ::10.889 MyTestWorkProduct[:] Method2-全部任务执行完成
第二种:异步任务时
dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group2 = dispatch_group_create(); dispatch_group_enter(group2);
dispatch_async(queue2, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-异步任务执行-:%ld",@"任务1",(long)i); }
dispatch_group_leave(group2);
}); dispatch_group_enter(group2);
dispatch_async(queue2, ^{
for (NSInteger i =; i<; i++) {
sleep();
NSLog(@"%@-异步任务执行-:%ld",@"任务2",(long)i); }
dispatch_group_leave(group2);
}); // //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
// dispatch_group_wait(group2, DISPATCH_TIME_FOREVER); //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
dispatch_group_notify(group2, queue2, ^{
NSLog(@"Method2-全部任务执行完成");
});
异步任务执行结果:
-- ::38.705 MyTestWorkProduct[:] 任务1-异步任务执行-:
-- ::38.705 MyTestWorkProduct[:] 任务2-异步任务执行-:
-- ::39.709 MyTestWorkProduct[:] 任务1-异步任务执行-:
-- ::39.709 MyTestWorkProduct[:] 任务2-异步任务执行-:
-- ::40.712 MyTestWorkProduct[:] 任务2-异步任务执行-:
-- ::40.712 MyTestWorkProduct[:] 任务1-异步任务执行-:
-- ::40.713 MyTestWorkProduct[:] Method2-全部任务执行完成
结论:
dispatch_group_enter(group)、dispatch_group_leave(group) 和 dispatch_group_notify(group1, queue1,block) 组合在执行同步任务时正常,在执行异步任务时正常。
dispatch_group_t 日常使用注意事项的更多相关文章
- Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)
ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...
- 超详细的HashMap解析(jdk1.8)
目录 一.预备知识 时间复杂度 基本数据结构 基本位运算 二.HashMap实现原理 结构 速度 三.源码分析 基本常量 基本成员变量 构造方法 put方法 remove 四.日常使用注意事项 五.总 ...
- Oracle GoldenGate OGG管理员手册(较早资料)
第一章 系统实现简述 前言 编写本手册的目的是为系统管理员以及相关操作人员提供 Oracle Goldengat 软 件的日常维护和使用的技术参考: 3 ORACLE 第二章 OGG 日常维护操作 ...
- ZooKeeper_基础知识学习
ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...
- Oracle GoldenGate OGG管理员手册
第一章 系统实现简述 前言 编写本手册的目的是为系统管理员以及相关操作人员提供 Oracle Goldengat 软 件的日常维护和使用的技术参考: 3 ORACLE 第二章 OGG 日常维护操作 ...
- 【转】Camera 简介
一.摄像头(CAMERA)又称为电脑相机.电脑眼等,它作为一种视频输入设备,在过去被广泛的运用于视频会议.远程医疗及实时监控等方面. 近年以来,随着互联网技术的发展,网络速度的不断提高,再加上感光成像 ...
- 不可错过的效能利器「GitHub 热点速览 v.22.39」
如果你是一名前端工程师且维护着多个网站,不妨试试本周榜上有名的 HTML-first 的 Qwik,提升网站访问速度只用一招.除了提升网站加载速度的 Qwik,本周周榜上榜的 Whisper 也是一个 ...
- ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项(红字需要留意)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- ORACLE分区表梳理系列(一)- 分区表概述、分类、使用方法及注意事项
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
随机推荐
- jquery与js的区别与基础操作
一.什么是 jQuery jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.它的作者是John Resig,于2006年创建的一个开源项目,随着 ...
- ReactiveSwift日常运用<一>
上一篇中,我已经很详细的介绍了ReactiveSwift,接下来我就举几个简单的例子供大家参考.1.键盘的监听这在我们开发中很常用,因为很多App都需要对登录注册进行判断,这样可以避免服务器存储很多废 ...
- 使用C#操作文件
读写文本文件 使用C#读写文本文件需要5个步骤: 1.创建文件流 2.创建阅读器或者写入器 3.执行读写操作 4.关闭阅读器或者写入器 5.关闭文件流 例 using System; using Sy ...
- node c++多线程插件构想
最近想写一个node的c++插件实现线程.提供的api使用回调并进行二次包装使其返回一个promise,并且要求需要在工作线程里执行的函数为async函数.如果是node7.0以下的版本,函数必须返回 ...
- 2020: [Usaco2010 Jan]Buying Feed, II
2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 220 Solved: 162[ ...
- checkSelfPermission 找不到 Android 动态权限问题
checkSelfPermission 找不到 Android 动态权限问题 最近写了一个Demo,以前好好地.后来手机更新了新系统以后,不能用总是闪退.而且我的小伙伴的是android 7.0系统 ...
- 读headFirst设计模式 - 装饰者模式
继承可以在复用父类代码的情况下扩展父类的功能,但同时继承增加了对象之间的耦合度,所以要慎用继承.那么有没有既能扩展父类的功能,又能使对象间解耦的方法呢?答案是肯定的,这就是我们今天要学习的装饰者模式. ...
- 使用htmlparse爬虫技术爬取电影网页的全部下载链接
昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...
- 通过Eclipse3.1以上启动Tomcat访问不到tomcat管理界面的问题(转载)
通过Eclipse插件启动Tomcat的问题 默认分类 2009-10-23 15:54 阅读118 评论0 字号: 大 中 小 目前在通过Eclipse中插件启动Tomcat时遇 ...
- 我的日志文件java logger
操作读取日志文件, 1.使用默认的日志文件,并验证默认级别 public void originalConfig() { Logger logger = Logger.getLogger(Logger ...