一、背景简介
平时在进行多线程处理任务时,有时候希望多个任务之间存在着一种联系,希望在所有的任务执行完后做一些总结性处理。
那么就可以将多个任务放在一个任务组中进行统一管理。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 日常使用注意事项的更多相关文章

  1. Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)

    ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...

  2. 超详细的HashMap解析(jdk1.8)

    目录 一.预备知识 时间复杂度 基本数据结构 基本位运算 二.HashMap实现原理 结构 速度 三.源码分析 基本常量 基本成员变量 构造方法 put方法 remove 四.日常使用注意事项 五.总 ...

  3. Oracle GoldenGate OGG管理员手册(较早资料)

    第一章 系统实现简述 前言 编写本手册的目的是为系统管理员以及相关操作人员提供 Oracle  Goldengat  软 件的日常维护和使用的技术参考: 3 ORACLE 第二章 OGG 日常维护操作 ...

  4. ZooKeeper_基础知识学习

    ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...

  5. Oracle GoldenGate OGG管理员手册

    第一章 系统实现简述 前言 编写本手册的目的是为系统管理员以及相关操作人员提供 Oracle  Goldengat  软 件的日常维护和使用的技术参考: 3 ORACLE 第二章 OGG 日常维护操作 ...

  6. 【转】Camera 简介

    一.摄像头(CAMERA)又称为电脑相机.电脑眼等,它作为一种视频输入设备,在过去被广泛的运用于视频会议.远程医疗及实时监控等方面. 近年以来,随着互联网技术的发展,网络速度的不断提高,再加上感光成像 ...

  7. 不可错过的效能利器「GitHub 热点速览 v.22.39」

    如果你是一名前端工程师且维护着多个网站,不妨试试本周榜上有名的 HTML-first 的 Qwik,提升网站访问速度只用一招.除了提升网站加载速度的 Qwik,本周周榜上榜的 Whisper 也是一个 ...

  8. ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项(红字需要留意)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  9. ORACLE分区表梳理系列(一)- 分区表概述、分类、使用方法及注意事项

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

随机推荐

  1. Hibernate学习笔记①

    ---恢复内容开始--- 1.JavaEE的三层结构 WEB层--Service层--DAO层 2.Hibernate版本 Hibernate3.x  4.x  5.x 4版本是过渡版本 不使用  5 ...

  2. 小白该怎么学《马哥Linux从入门到精通》

    首先,必须说明我已经不是小白啦~现在的我在国内某独角兽担任运维工程师,带着一个四人小团队,在运维方面也算是有些心得,勉强过来回答一下这个问题,就算抛砖引玉了. 所有人都是从小白阶段过来的,我=也经历过 ...

  3. 升级后 VTE 类虚拟终端不工作

    故障现象 运行 vte 终端,如 gnome terminal.sakura 等光标不出来.xterm 可以运行. 在 xterm 终端中运行 gnome terminal 出现一下错误: grant ...

  4. Selenium2 WebDriver环境搭建

    1.下载Selenium Client Servers包 在Selenium官网上可以下载到最新的开源的包http://seleniumhq.org/download/,根据编写测试脚本所使用的语言下 ...

  5. 基于Spring Cloud和Netflix OSS构建微服务,Part 2

    在上一篇文章中,我们已使用Spring Cloud和Netflix OSS中的核心组件,如Eureka.Ribbon和Zuul,部分实现了操作模型(operations model),允许单独部署的微 ...

  6. (23)IO之打印流 PrintStream & Printwriter

    PrintStream PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的增强,其中定义了很多的重载的print()和println(),方便输出各种类型的数据. Pr ...

  7. .net平台的MongoDB使用

    前言 最近花了点时间玩了下MongoDB.Driver,进行封装了工具库,平常也会经常用到MongoDB,因此写一篇文章梳理知识同时把自己的成果分享给大家. 本篇会设计到Lambda表达式的解析,有兴 ...

  8. RPC漏洞

    DCOM漏洞:利用这个漏洞攻击者只需发送特殊形式的清求到远程计算机上的135端口,轻则会造成拒绝服务攻击,严重的甚至可以让远程攻击者以本地管理员权限执行任何操作. 攻击过程:扫描也可用xscan+DC ...

  9. c#实现list,dataset,DataTable转换成josn等各种转换方法总和

    using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Refle ...

  10. (转)关闭iptables和SELinux

    1. 关闭SELinux setenforce 0   #临时关闭 编辑/etc/selinux/config,找到SELINUX 行修改成为:SELINUX=disabled:     #永久关闭, ...