本文只对GCD的其他操作进行一些补充。

1、延迟操作

实例:

//延时操作
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

});
 
        /*
        dispatch_after的参数
参数1  dispatch_time_t when
多少纳秒之后执行
参数2  dispatch_queue_t queue
任务添加到那个队列
参数3  dispatch_block_t block
要执行的任务
    */

2、一次性执行

(1)定义:程序运行中只执行一次。一次性执行是线程安全的,可以使用一次性执行创建单例对象,效率比互斥锁高。

(2)实现:可以用来创建单例对象。

//原理:当onceToken为0时执行方法,然后将全局变量oneceToken更改为-1,以后就无法再执行。
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
    //要执行一次的代码;

});

3、调度组

(1)定义:有时候需要在多个异步任务都执行完成之后继续做某些事情,比如下载歌曲,等所有的歌曲都下载完毕之后转到主线程提示用户,这样需要一个顺序的统一调度。

(2)实现:

//1 全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //2 调度组
    dispatch_group_t group = dispatch_group_create();
    //3 添加任务
    //把任务添加到队列,等任务执行完成之后通知调度组,任务是异步执行
    dispatch_group_async(group, queue, ^{
        NSLog(@"歌曲1下载完毕  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"歌曲2下载完毕  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"歌曲3下载完毕  %@",[NSThread currentThread]);
    });
    //4 所有任务都执行完成后,获得通知 (异步执行)
    //等调度组中队列的任务完成后,把block添加到指定的队列
    dispatch_group_notify(group, queue, ^{
        NSLog(@“所有歌曲都已经下载完毕!   %@",[NSThread currentThread]);
    });
 
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //在主线程,更新UI控件,提示用户
        NSLog(@“播放器更新完毕!  %@",[NSThread currentThread]);
    });
    NSLog(@"over");

(3)原理:
 //1 全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
 
    //2 调度组
    dispatch_group_t group = dispatch_group_create();
 
    //ARC中不用写
//    dispatch_retain(group);
    //3 进入调度组,执行此函数后,再添加的异步执行的block都会被group监听
    dispatch_group_enter(group);
    
    //4 添加任务一
    dispatch_async(queue, ^{
        NSLog(@“下载第一首歌曲!”);
        dispatch_group_leave(group);
        //ARC中此行不用写,也不能写
//        dispatch_release(group);
    });

//5 添加任务二
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        NSLog(@“下载第二首歌曲”);
        dispatch_group_leave(group);
        //ARC中此行不用写,也不能写
        //dispatch_release(group);
    });
    
    //6  获得调度组的通知
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@“歌曲都已经下载完毕! %@",[NSThread currentThread]);
    });
//7 等待调度组 监听的队列中的所有任务全部执行完毕,才会执行后续代码,会阻塞线程(很少使用)
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

转载于:https://www.cnblogs.com/David-SU/p/5274386.html

五、线程管理————GCD相关推荐

  1. 聊一聊Flutter Engine线程管理与Dart Isolate机制

    阿里妹导读:Flutter是一款开源的移动跨平台UI开发套件,它不仅与现存的Native代码兼容,还能帮你用Dart语言快速开发高质量的跨平台App. 本文由闲鱼技术团队福居撰写,结合Flutter ...

  2. api windows 线程加锁_Windows 进程与线程管理

    第六章 进程与线程管理 本章我们把注意力集中到Windows 的进程.线程与作业对象上.正如我们在前面的章节中所述的,Windows的设计以基于对象的思想作为基础.在本章的第一节中,主要介绍进程与线程 ...

  3. c语言中的线程管理,深入解析C++编程中线程池的使用

    为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采 ...

  4. RTThread 线程管理

    线程是实现任务的载体,它是 RT-Thread 中最基本的调度单位,它描述了一个任务执行的运行环境,也描述了这个任务所处的优先等级,重要的任务可设置相对较高的优先级,非重要的任务可以设置较低的优先级, ...

  5. 操作系统实验4——内核线程管理

    操作系统实验4--内核线程管理 一. 实验目的 二. 实验内容 三. 实验准备 1. proc_struct结构: 2. 进程与线程 四. 实验步骤 (一) 练习0:填写已有实验 (二) 练习1:分配 ...

  6. RT-Thread 线程管理(学习笔记)

    本文参考自[野火EmbedFire]<RT-Thread内核实现与应用开发实战--基于STM32>,仅作为个人学习笔记.更详细的内容和步骤请查看原文(可到野火资料下载中心下载) 文章目录 ...

  7. RT-Thread线程管理以及内核裁剪

    RT-Thread线程管理以及内核裁剪 文章目录 RT-Thread线程管理以及内核裁剪 1. RTOS概述 1.1 RTOS的定义 1.2 主流RTOS 2. RT-Thread架构 3. RT-T ...

  8. java 线程的创建和执行_线程管理(一)线程的创建和运行

    声明:本文是< Java 7 Concurrency Cookbook>的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:欧振聪 线程的创建和运行 ...

  9. Unix进程和线程管理及其异同

    Unix进程和线程管理及其异同 一,进程 1,什么是进程 在最初的单处理器系统中,系统中的多道程序按照一定规则切换而实现多任务处理,后来发现多个程序并发导致系统资源被共享,为了描述和管理程序对共享资源 ...

最新文章

  1. tensorflow 2
  2. 双十一:你收到了多少商家短信
  3. Make Games with Python Pygame (2)
  4. 【新版上线】网易云点播内容加密服务正式发布啦!
  5. mysql 删除重复数据_MySQL查找和删除重复数据
  6. bs架构的系统能连接mysql吗_HTTP、BS架构
  7. 设备上的介质簇的结构不正确_环保设备选型参考系列——生化系统之潜水搅拌机【价格】...
  8. TortoiseSVN and TortoiseGit 版本控制图标不见了
  9. java用1234组成_java编程题,java1234组成三位数不重复
  10. C#集合练习题(链表LinkedListT)
  11. Word如何使用预设样式、自定样式以及生成自动目录教程
  12. 【JavaWeb】消息摘要、数字签名与数字证书的区别
  13. 9个方法,教你用Google Drive做好云端档案管理
  14. python中keys的用法_在Python中用keys()方法返回字典键的教程
  15. 专科学历事业单位工资计算机,【事业单位工资标准表】 事业单位学历工资标准...
  16. 测试一个教室和一个椅子
  17. 聊聊storm的WindowedBolt
  18. 数据结构之冒泡排序算法(图解+分析+代码调优)
  19. 电脑c盘满了怎么清理,快速清理,用这5招
  20. IP地址划分(子网划分)及是否同一网段计算

热门文章

  1. 基于HTML5技术的电力3D监控应用(三)
  2. DotLucene源码浅读笔记(1) : Lucene.Net.Analysis
  3. 一个阿里云 MYSQL 服务 RDS 下的查询优化
  4. struts2通过基于XML的配置实现校验没有提示信息
  5. minSdkVersion = targetSdkVersion = compileSdkVersion
  6. C++实现有序表折半查找
  7. EditText 输入类型 android:inputType=quot;参数类型quot;
  8. Map集合HashMap TreeMap的输出方法
  9. Mysql常用的命令
  10. 电商网站全链路压测实战