A B C D 4个并发下载任务,怎样在第一时间知道任务全部完成?

dispatch_group 可以帮我们实现这样的控制。

上代码,看说明.

  1. dispatch_group_t group = dispatch_group_create();
  2. // 某个任务放进 group
  3. dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
  4. // 任务代码1
  5. });
  6. dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
  7. // 任务代码2
  8. });
  9. dispatch_group_notify(group, dispatch_get_main_queue(), ^{
  10. // 任务全部完成处理
  11. NSLog(@"isover");
  12. });

创建一个任务组,然后将异步操作放进组里面,在最后用notify 告知所有任务完成,并做相应处理,一般来说都是在主线程里面刷新UI来提示用户了。你如果不依赖UI放进子线程里面也是没有问题的。当然group同步的方式还有其他

  1. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  2. for (int i = 0; i < 3; i ++)
  3. {
  4. dispatch_group_enter(group);
  5. // 任务代码i 假定任务 是异步执行block回调
  6. // block 回调执行
  7. dispatch_group_leave(group);
  8. // block 回调执行
  9. }
  10. });
  11. dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
  12. dispatch_async(dispatch_get_main_queue(), ^{
  13. // 主线程处理
  14. });

首先我们异步执行,因为dispatch_group_wait函数是阻塞的,for里面安排了三个任务,这三个任务都是加载,在任务开始前 调用 enter,任务完成时调用leave,wait函数一直阻塞,直到它发现group里面的任务全部leave,它才放弃阻塞(任务全部完成),然后我们在主线程更新UI告知用户.

多线程并发流程控制之dispatch_group 有关函数的更多相关文章

  1. JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结

    JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA的思想真的很重要,所以要专心的学-- ...

  2. JavaScript基础知识:数据类型,运算符,流程控制,语法,函数。

    JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...

  3. 【mysql的编程专题①】流程控制与其他语法

    流程控制与内置函数,一般用在select的field字段上,或者用在函数,存储过程,触发器中; 如果用在select上就会随着query出来的row来隐式迭代; 注释与语句结束符 语句结束符 默认有两 ...

  4. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  5. MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引

    本文内容: 视图 触发器 事务 存储过程 内置函数 流程控制 索引 ------------------------------------------------------------------ ...

  6. MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  7. MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引

    一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  8. MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化

    视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...

  9. mysql数据库之 存储引擎、事务、视图、触发器、存储过程、函数、流程控制、数据库备份

    目录 一.存储引擎 1.什么是存储引擎? 2.mysql支持的存储引擎 3. 使用存储引擎 二.事务 三.视图 1.什么是视图 2.为什么要用视图 3.如何用视图 四.触发器 为何要用触发器 创建触发 ...

随机推荐

  1. [PCL]NDT点云匹配方法

    测试NDT方法的Demo,http://pointclouds.org/documentation/tutorials/normal_distributions_transform.php#norma ...

  2. Using RestTemplate, how to send the request to a proxy first so I can use my junits with JMeter?

    org.springframework.http.client.SimpleClientHttpRequestFactory java.net.Proxy java.net.Proxy.Type ja ...

  3. log4j使用

    Spring中在src/main/resources下创建log4j.xml 或log4j.properties,在maven下打包时resources文件夹下面的文件会自动copy到WEB-INF/ ...

  4. ios app 解决微信扫二维码不能跳转问题

    <script> (function(){ // Setup GA (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i ...

  5. vs2015社区版不支持installshield

    开始学习vs了 下一步就是在这个平台上提升技术咯. 写了老师上课讲的算法 生成了个VB程序结果不能在别的电脑上运行 .幸好我自己测试了下.要是直接拿去学校不是很~ 然后我就想到当初接触易语言时候的搞静 ...

  6. 初始化 Gradle 工程目录(转自: 隔叶黄莺 Unmi Blog)

    最近重新在 Eclipse 中打开旧的 Maven 项目,总有些什么错误,备受折磨.期间试手了 Ant+Ivy, 现今试用了下 Gradle,感觉不错,它应该才是我真想要的,Maven 差不多该扔到一 ...

  7. C++Builder组件

    1.TOpenDialog: Title属性:用于获取或设置对话框标题,如果么偶有给该属性赋值,则系统将使用默认值标题:“打开” .InitialDir属性:用于获取或设置文件对话框显示的初始目录.如 ...

  8. php setcookie(name, value, expires, path, domain, secure) 参数详解

    setcookie() 定义一个和其余的 HTTP 标头一起发送的 cookie.和其它标头一样,cookie 必须在脚本的任何其它输出之前发送(这是协议限制).这 需要将本函数的调用放到任何输出之前 ...

  9. node.js http.get 和http.post 数据

    http.get('http://codestudy.sinaapp.com', function (response) {}); node.js http post 样例: var reqData= ...

  10. URAL 1876 Centipede's Morning(数学)

    A centipede has 40 left feet and 40 right feet. It keeps a left slippers and b right slippers under ...