dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:

  1. [cpp]
  2. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  3. dispatch_group_t group = dispatch_group_create();
  4. dispatch_group_async(group, queue, ^{
  5. [NSThread sleepForTimeInterval:1];
  6. NSLog(@"group1");
  7. });
  8. dispatch_group_async(group, queue, ^{
  9. [NSThread sleepForTimeInterval:2];
  10. NSLog(@"group2");
  11. });
  12. dispatch_group_async(group, queue, ^{
  13. [NSThread sleepForTimeInterval:3];
  14. NSLog(@"group3");
  15. });
  16. dispatch_group_notify(group, dispatch_get_main_queue(), ^{
  17. NSLog(@"updateUi");
  18. });
  19. dispatch_release(group);
  20. dispatch_group_async是异步的方法,运行后可以看到打印结果:
  21. 2012-09-25 16:04:16.737 **Test[43328:11303] group1
  22. 2012-09-25 16:04:17.738 **Test[43328:12a1b] group2
  23. 2012-09-25 16:04:18.738 **Test[43328:13003] group3
  24. 2012-09-25 16:04:18.739 **Test[43328:f803] updateUi

复制代码

每个一秒打印一个,当第三个任务执行后,upadteUi被打印。3、dispatch_barrier_async的使用

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

例子代码如下:

  1. [cpp]
  2. dispatch_queue_t queue = dispatch_queue_create("**test.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
  3. dispatch_async(queue, ^{
  4. [NSThread sleepForTimeInterval:2];
  5. NSLog(@"dispatch_async1");
  6. });
  7. dispatch_async(queue, ^{
  8. [NSThread sleepForTimeInterval:4];
  9. NSLog(@"dispatch_async2");
  10. });
  11. dispatch_barrier_async(queue, ^{
  12. NSLog(@"dispatch_barrier_async");
  13. [NSThread sleepForTimeInterval:4];
  14. });
  15. dispatch_async(queue, ^{
  16. [NSThread sleepForTimeInterval:1];
  17. NSLog(@"dispatch_async3");
  18. });

复制代码

打印结果:

2012-09-25 16:20:33.967 **Test[45547:11203] dispatch_async1
2012-09-25 16:20:35.967 **Test[45547:11303] dispatch_async2
2012-09-25 16:20:35.967 **Test[45547:11303] dispatch_barrier_async
2012-09-25 16:20:40.970 **Test[45547:11303] dispatch_async3
请注意执行的时间,可以看到执行的顺序如上所述。

4、dispatch_apply
执行某个代码片段N次。

  1. dispatch_apply(5, globalQ, ^(size_t index) {
  2. // 执行5次
  3. });

复制代码

原文链接:http://www.2cto.com/kf/201209/157722.html

点击返回按钮以后,取消gcd子线程

dispatch_suspend(downloadNewsQueue);
dispatch_release(downloadNewsQueue);
downloadNewsQueue=nil;

注意:gcd在使用时,也要判断一下downloadNewsQueue是否为nil

参考:http://www.cocoachina.com/bbs/simple/?t129464.html

dispatch_group_async 使用详解的更多相关文章

  1. iOS开发——GCD多线程详解

    GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...

  2. 《招一个靠谱的移动开发》iOS面试题及详解(下篇)

    iOS面试知识点 现在进入本篇的正题.本篇的面试题是我认为比较好的iOS开发基础知识点,希望大家看过这后在理解的基础上掌握而不是死记硬背.死记硬背很快也会忘记的. 1 iOS基础 1.1 父类实现深拷 ...

  3. 《招一个靠谱的移动开发》iOS面试题及详解(上篇)

    以下问题主要用于技术的总结与回顾 主要问题总结 单例的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 多线程.特别是NSOperation 和 GCD ...

  4. Swift - 多线程GCD详解

    //  GCD详解 //  目录: //  1. 创建GCD队列(最常用) //  2. 自定义创建队列 //  3. 使用多线程实现延迟加载 //  4. 使用多线程实现重复(循环) //  5. ...

  5. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  6. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  7. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  8. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  9. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

随机推荐

  1. MySQL乱码问题以及utf8mb4字符集

    MySQL乱码问题以及utf8mb4字符集 1.乱码 推荐大家看 深入MySQL字符集设置 ,区分检查client端.server端的编码:最简单暴力的方式,是在所有的环节都显式明确的指定相同的编码, ...

  2. java虚拟机规范(se8)——java虚拟机结构(一)

    本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第二章 虚拟机结构 本文档描述了一个抽象的虚拟机规范,并不描述 ...

  3. MySql 新建用户与数据库的实际操作步骤

    以下的文章主要讲述的是MySql 新建用户的创建.新建数据库的实际操作步骤以及用户如何进行授权和删除用户的实际操作方案.还有对修改密码的实际操作,以下就是正文的主要内容的创建. 1.MySql 新建用 ...

  4. jexus docker

    一.准备工作 1.init.sh 文件 #!/bin/bash # Stop your services function stop_svc { /usr/jexus/jws stop >/de ...

  5. 【论文阅读】Learning Spatial Regularization with Image-level Supervisions for Multi-label Image Classification

    转载请注明出处:https://www.cnblogs.com/White-xzx/ 原文地址:https://arxiv.org/abs/1702.05891 Caffe-code:https:// ...

  6. 解决Eclipse启动报错【Failed to create the Java Virtual Machine】

    电脑:2G内存,WIN7 32位. 启动adt-bundle-windows-x86-20140702\eclipse\eclipse.exe时,报错[Failed to create the Jav ...

  7. 最长回文子串—Manacher 算法 及 python实现

    最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串.   给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ...

  8. nginx no input file specified

    今天在lnmp上调试php项目,之前已经在上面测试过tp5框架,可以正常访问.但是新项目由于项目中有些路径是写固定路径的.为了不去修改代码.配置新项目的时候,为新项目设置新的目录.问题就出现了,网页提 ...

  9. 009.Zabbix幻灯片展示

    一 Slide shows简介 Slide shows在多个Screens之间以幻灯片的方式来展示,使一个屏幕可以显示多个页面. 二 Slide shows配置 2.1 创建多个Screen Slid ...

  10. 使用ApiPost测试接口时需要先登录怎么办?利用Cookie模拟登陆!

    ApiPost简介: ApiPost是一个支持团队协作,并可直接生成文档的API调试.管理工具.它支持模拟POST.GET.PUT等常见请求,是后台接口开发者或前端.接口测试人员不可多得的工具 . 下 ...