<一>引入dispatch_group函数的目的

在追加到dispatch_Queue中的多个处理全部结束后想要执行结束的处理,这种需求经常会在我们的程序中出现

(第一种情况)只使用一个Serial Dispatch Queue时,只要将想要执行的操作全部追加到串行队列,并在最后执行结束的操作即可实现

(第二种情况)当我们使用Concurrent Dispatch Queue时或者使用多个Dispatch Queue时,我们想要实现这种需求变得十分复杂

(由第二种情况引出Dispatch Group)使用Dispatch Group可以实现组处理,我们可以把想要执行的操作放在操作组里,并通过监视,如果组中的操作全部执行完毕时,我们就可以执行结束处理的操作

<二>使用dispatch_group_notify函数实现组处理

dispatch_group_notify(dispatch_group_t groupdispatch_queue_t queue^(void)block)

dispatch_group_t group:参数指定为要监视的Dispatch Group

在被追加到第一个参数中对应的全部处理全部执行结束后,将会把第三个参数的Block追加到第二个参数的queue中

**在dispatch_group_notify函数中不管指定什么样的Dispatch Queue,属于Dispatch Group的全部处理在追加指定的Block时都已经执行结束

 /*!
* @brief 使用dispatch_group_notify函数进行组处理
*/
- (void)groupTest1 { //创建调度组
dispatch_group_t group = dispatch_group_create();
//获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//调度组的异步请求
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:];
NSLog(@"下载第一张图");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:]; NSLog(@"下载第二张图");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:]; NSLog(@"下载第三张图");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:]; NSLog(@"下载第四张图");
});
//notify通知,当所有异步请求完成时调用dispatch_group_notify
dispatch_group_notify(group, queue, ^{
NSLog(@"更新UI");
});
/*!
* @brief 输出结果
*
2016-03-15 22:35:44.630 GCD其他方法[6766:208644] 下载第三张图
2016-03-15 22:35:45.632 GCD其他方法[6766:208629] 下载第一张图
2016-03-15 22:35:46.632 GCD其他方法[6766:208643] 下载第二张图
2016-03-15 22:35:48.632 GCD其他方法[6766:208651] 下载第四张图
2016-03-15 22:35:48.632 GCD其他方法[6766:208643] 更新UI
*/
}

notify实现组处理

<三>使用dispatch_group_wait函数实现组处理

dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout)

dispatch_time_t timeout:参数用来指定等待的时间

这里的等待表示,一旦调用dispatch_group_wait函数,该函数就处理调用的状态而不返回值,只有当函数的currentThread停止,或到达wait函数指定的等待的时间,或Dispatch Group中的操作全部执行完毕之前,执行该函数的线程停止.

当指定timeout为DISPATCH_TIME_FOREVER时就意味着永久等待

当指定timeout为DISPATCH_TIME_NOW时就意味不用任何等待即可判定属于Dispatch Group的处理是否全部执行结束

如果dispatch_group_wait函数返回值不为0,就意味着虽然经过了指定的时间,但Dispatch Group中的操作并未全部执行完毕

如果dispatch_group_wait函数返回值为0,就意味着Dispatch Group中的操作全部执行完毕

 /*!
* @brief 使用dispatch_group_wait函数进行组处理
*/
- (void)groupTest1 { //创建调度组
dispatch_group_t group = dispatch_group_create();
//获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//调度组的异步请求
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:];
NSLog(@"下载第一张图");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:]; NSLog(@"下载第二张图");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:]; NSLog(@"下载第三张图");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:]; NSLog(@"下载第四张图");
});
//使用wait函数表示只要group中有操作没有执行结束就一直等待
//dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
//NSLog(@"更新UI");
/*!
* @brief 输出结果
*
2016-03-15 22:35:44.630 GCD其他方法[6766:208644] 下载第三张图
2016-03-15 22:35:45.632 GCD其他方法[6766:208629] 下载第一张图
2016-03-15 22:35:46.632 GCD其他方法[6766:208643] 下载第二张图
2016-03-15 22:35:48.632 GCD其他方法[6766:208651] 下载第四张图
2016-03-15 22:35:48.632 GCD其他方法[6766:208643] 更新UI
*/
}

wait函数实现组操作

<三>使用dispatch_group_enter和dispatch_group_leave实现组处理

dispatch_group_enter(dispatch_group_t group)

在函数开始时调用enter函数

dispatch_group_leave(dispatch_group_t group)

在函数结束时调用leave函数

 /*!
* @brief 使用dispatch_group_enter和dispatch_group_leave函数实现组处理
*/
- (void)groupTest2 { //创建调度组
dispatch_group_t group = dispatch_group_create();
//获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(, ); //进入队列
dispatch_group_enter(group);
dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:];
NSLog(@"下载第一张图"); //离开队列
dispatch_group_leave(group);
}); dispatch_group_enter(group);
dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:];
NSLog(@"下载第二张图"); dispatch_group_leave(group);
}); dispatch_group_enter(group);
dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:];
NSLog(@"下载第三张图"); dispatch_group_leave(group);
}); //等待调度队列wait相当于一个阻塞状态
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); NSLog(@"更新UI");
/*!
* @brief 输出结果
*
2016-03-15 22:36:49.277 GCD其他方法[6783:209444] 下载第二张图
2016-03-15 22:36:50.280 GCD其他方法[6783:209429] 下载第一张图
2016-03-15 22:36:51.279 GCD其他方法[6783:209445] 下载第三张图
2016-03-15 22:36:51.279 GCD其他方法[6783:209352] 更新UI
*/ }

enter和leave实现组处理

GCD中的dispatch_group函数的详解的更多相关文章

  1. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  2. php中的PDO函数库详解

    PHP中的PDO函数库详解 PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,P ...

  3. PHP中的 $_SERVER 函数说明详解

    用php在开发软件的时候,我们经常用到 $_SERVER[]这个函数,今天就来讲下这个数组的值,方便以后使用: A: $_SERVER['ARGC'] #包含传递给程序的 命令行参数的个数(如果运行在 ...

  4. python中os模块函数方法详解最全最新

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 import os print(os.getcwd()) os.chdir("dirname") 改 ...

  5. C#中Console.WriteLine()函数输出格式详解

    格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道: ",alignment&q ...

  6. MySQL中的RAND()函数使用详解(order by rand() 随机查询取前几条记录)

    MySQL RAND()函数调用可以在0和1之间产生一个随机数: mysql> SELECT RAND( ), RAND( ), RAND( ); +------------------+--- ...

  7. MySQL中的RAND()函数使用详解

    转自:https://www.jb51.net/article/66697.htm MySQL RAND()函数调用可以在0和1之间产生一个随机数: ? 1 2 3 4 5 6 7 mysql> ...

  8. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  9. php中setcookie函数用法详解(转)

    php中setcookie函数用法详解:        php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见.        语法:        bool set ...

随机推荐

  1. 模块化利器: 一篇文章掌握RequireJS常用知识

    通过本文,你可以对模块化开发和AMD规范有一个较直观的认识,并详细地学习RequireJS这个模块化开发工具的常见用法.本文采取循序渐进的方式,从理论到实践,从RequireJS官方API文档中,总结 ...

  2. 使用Python将HTML转成PDF

    主要使用的是wkhtmltopdf的Python封装--pdfkit 安装 1. Install python-pdfkit: $ pip install pdfkit 2. Install wkht ...

  3. 基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

    在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交,方便页面和服务器后端进行数据的交互处理.本文主要介绍利用Jquery处理数据交互的几种方式,包括 ...

  4. 微信开发中遇到“当前页面的url未注册”问题

    在公众号后台设置支付授权目录,完全按照规则去设定的,但是在实际测试中会出现“当前页面的url未注册”的问题,反复确认后发现目录并没有问题,唯一的区别就是大小写不同. 但是一般url不都是不区分大小写的 ...

  5. C#系统缓存全解析(转载)

    C#系统缓存全解析 对各种缓存的应用场景和方法做了很详尽的解读,这里推荐一下 转载地址:http://blog.csdn.net/wyxhd2008/article/details/8076105

  6. Monotype推出基于HTML5的Web字体平台

    著名字体公司Monotype近日宣布推出基于HTML5的Web字体平台,设计者可以访问近10万字体的目录. Monotype推出基于HTML5的Web字体平台 Monotype推出基于HTML5的We ...

  7. C# 通过GPS坐标,计算两点之间距离

    之前在网上有很多这种计算的,但是代码都不怎么全.经过多方打听查询.找到完整代码.现将代码共享给大家. 有需要者觉得有用者欢迎使用.觉得用或简单的高手,请绕. public static double ...

  8. sql server删除默认值(default)的方法

    不废话了----- 例如要删除student表的sex默认值 sp_help student;查询结果 找到constraiont_name的对应的值 最后 ALTER TABLE student D ...

  9. 【算法和数据结构】_12_小算法_abs_fabsf_fabsd_大端小端判断

    最近学习要用到求绝对值函数,看了一下有很多种的abs函数,因此想自己实现这些代码. 下面是我进行测试的代码: #include <stdio.h> typedef unsigned int ...

  10. socket.io,理解socket.io

    原文:http://www.cnblogs.com/xiezhengcai/p/3957314.html 要理解socket.io ,不得不谈谈websocket 在html5之前,因为http协议是 ...