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. ipsec-tools安装教程

    ipsec-tools最新版本为0.8.2,此处以0.7.3版本为例说明安装和使用过程.可参考ipsec-howto. 安装步骤 ipsec-tools依赖于linux2.6版本内核,在安装ipsec ...

  2. 使用css实现移动端导航条滚动

    <div class="tab"> <div class="table-item"> <span class="tab- ...

  3. SecureCRT中常用linux命令 -《转载》

    常用命令: 一.ls 只列出文件名 (相当于dir,dir也可以使用) -A:列出所有文件,包含隐藏文 件. -l:列表形式,包含文件的绝大部分属性. -R:递归显示. --help:此命令的帮助. ...

  4. 和为k的最长子数组及其延伸

    问题1: /** * 问题描述: * 给定一个无序数组arr,其中元素可正.可负.可0, * 求arr所有的子数组中正数与负数个数相等的最长子数组长度 * * 解题思路:对数组进行处理,正数为1,负数 ...

  5. FileInputStram入门

    1.read() 读取一个字节 @Test public void test1() throws Exception{  //1.指定文件读取路径  String filePath = "E ...

  6. nodejs乱码处理

    1.处理回显乱码 res.write("<head><meta charset='utf-8'></head>"); 2.处理传参乱码 quer ...

  7. yum命令简介

    yum 一些较常见的用法 命令 功能 yum check-update 检查可更新的所有软件包 yum update 下载更新系统已安装的所有软件包 yum upgrade 大规模的版本升级,与yum ...

  8. prometheus如何使用blackbox-exporter来获取k8s的网络性能

    如果学会了如何抓取app的metrics,则blackbox-exporter抓取网络性能套路是相同的. 一,在blackbox-exporter的blackbox.yml里配置好抓取模块,常见的是h ...

  9. 【LOJ】#2569. 「APIO2016」最大差分

    题解 第一个子任务直接询问最大最小,每次可以问出来两个,再最大最小-1再问两个,最多问\(\frac{N + 1}{2}\)次就还原出了序列 第二个子任务由于差分肯定会大于等于\(\lceil \fr ...

  10. 主动学习(Active Learning)

    主动学习简介 在某些情况下,没有类标签的数据相当丰富而有类标签的数据相当稀少,并且人工对数据进行标记的成本又相当高昂.在这种情况下,我们可以让学习算法主动地提出要对哪些数据进行标注,之后我们要将这些数 ...