什么是GCD
          Grand Central Dispatch(强大的调度器),是一个C语言API;
          作用:多核并行运算的解决方案;

 GCD中有2个核心概念
     队列:用来存放任务
     任务:执行什么操作

工作原理:
          GCD会讲队列中的任务取出、放到相应的线程中;
          任务的取出遵循队列的FIFO原则:先进先出、后劲后出;
 

GCD的使用就2个步骤
     1、创建队列:
     2、定制任务,并添加到队列中:


GCD执行任务:
     两个执行任务的函数:
     1、同步(即按顺序执行)
          dispatch_sync(dispatch_queue_tqueue,
dispatch_block_tblock);
  • queue:队列
  • block:任务
      2、异步(并发执行任务)
     dispatch_async(dispatch_queue_tqueue,
dispatch_block_tblock);

  • 同步和异步的区别:
          同步:只在当前线程中执行任务、不具备开启新线程的能力;
          异步:可以在新的线程中执行任务、具备开始新线程的能力;

队列的类型
     两大类型:
     1、并发队列(Concurrent Dispatch Queue)
          可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
          但由于,同步执行函数不具备开启新线程的能力,所以无效;
     2、串行队列(Serial Dispatch Queue):
          让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务);
     
  • 有4个术语比较容易混淆:同步、异步、并发、串行
          同步、异步是针对GCD的执行函数而言;
                    二者区别:是否具有开始新线程的能力;
          并发、串行是针对GCD的队列而言;
                    二者的区别任务的执行方式

创建队列
    
     1、创建并发队列:
          (1)GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创创建
          使用dispatch_get_global_queue函数获得全局的并发队列;
     dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
//
获得全局并发队列
  • 全局并发队列的优先级
  • #define DISPATCH_QUEUE_PRIORITY_HIGH
    2
    // 高
  • #define DISPATCH_QUEUE_PRIORITY_DEFAULT
    0
    // 默认(中)
  • #define DISPATCH_QUEUE_PRIORITY_LOW (-2)
    //
  • #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
    //
    后台
          (2)自己创建并发队列

dispatch_queue_t

dispatch_queue_create(const
char
*label, dispatch_queue_attr_t
attr);
       lable ://队列名称
       attire://队列的属性;

DISPATCH_QUEUE_CONCURRENT:并发队列

DISPATCH_QUEUE_SERIAL:串行队列;

         
2、创建串行队列:
          
    (1)、自己创建串行队列

dispatch_queue_t

dispatch_queue_create(const
char
*label, dispatch_queue_attr_t
attr);
       lable ://队列名称
       attire://队列的属性;
          DISPATCH_QUEUE_SERIAL:串行队列;
          DISPATCH_QUEUE_CONCURRENT:并发队列
  (2)、使用主队列(跟主线程相关联的队列 
          dispatch_queue_t queue =
dispatch_get_main_queue();

  • 主队列是GCD自带的一种特殊的串行队列
  • 放在主队列中的任务,都会放到主线程中执行

各种队列的执行效果



线程间通信示例
  • 从子线程回到主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{
             //
执行耗时的异步操作...
   
    dispatch_async(dispatch_get_main_queue(),
^{
               
// 回到主线程,执行UI刷新操作
          });
});


延时执行

iOS常见的延时执行有2种方式
     1、调用NSObject的方法
[self
performSelector:@selector(run)
withObject:nil
afterDelay:2.0];
     // 2秒后再调用self的run方法
     2、使用GCD函数
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(2.0
*
NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
   
// 2秒后执行这里的代码...在哪个线程执行,跟队列类型有
});

iOS - 多线程——GCD的更多相关文章

  1. iOS多线程 GCD

    iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ...

  2. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  3. iOS 多线程 GCD part3:API

    https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...

  4. ios多线程-GCD基本用法

    ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...

  5. iOS多线程——GCD与NSOperation总结

    很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不 ...

  6. iOS多线程GCD的使用

    1. GCD 简介 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Di ...

  7. iOS多线程GCD详解

    在这之前,一直有个疑问就是:gcd的系统管理多线程的概念,如果你看到gcd管理多线程你肯定也有这样的疑问,就是:并发队列怎么回事,即是队列(先进先出)怎么会并发,本人郁闷了好久,才发现其实cgd管理多 ...

  8. iOS多线程GCD的简单使用

    在iOS开发中,苹果提供了三种多线程技术,分别是: (1)NSThread (2)NSOperation (3)GCD 简单介绍一下GCD的使用. GCD全称 Grand Central Dispat ...

  9. iOS多线程——GCD篇

    什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObjec ...

  10. iOS 多线程GCD简介

    一.简介 1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法. Grand 含义是“伟大的.宏大的”,Central含义“中央的”,Dispat ...

随机推荐

  1. apache httpd 不记录head 的请求。

    比如说用了阿里云的slb ,然后他会检测服务器是否正常运行,通常会发大量的HEAD 请求过来. 这样有规则的请求是可以屏蔽的.步骤如下: 在 <Directory />中添加 SetEnv ...

  2. 数据库范式1NF 2NF 3NF详细阐述

    范式:关系数据库中的关系是要满足一定要求的,满足不同程度要求的不同范式.满足最低要求的叫第一范式,简称1NF ,在第一范式中满足进一步要求的为第二范式,其余以此类推.通俗来说是满足数据库关系表中的一套 ...

  3. 【Django】rest_framework 序列化自定义替换返回值

    # 序列化设置 class PagerSerialiser(serializers.ModelSerializer): name = serializers.CharField(source=&quo ...

  4. 13.3 Go章节练习题

    13.3 Go章节练习题 练习1:定义1个整数,1个小数,访问变量,打印数值和类型,更改变量的数值,打印数值 练习2:同时定义3个整数, 练习3:同时定义3个字符串 练习4:定义变量后,没有初始值,直 ...

  5. BitArray虽好,但请不要滥用,又一次线上内存暴增排查

    一:背景 1. 讲故事 前天写了一篇大内存排查在园子里挺火,这是做自媒体最开心的事拉,干脆再来一篇满足大家胃口,上个月我写了一篇博客提到过使用bitmap对原来的List<CustomerID& ...

  6. SVN:TortoiseSVN SendRpt.exe not found 完美解决

    今天来上班的时候,发现公司用的svn版本和我自己的不一致,其实可以使用但是还是神经质的更新了一下.结果每次右键都会出一个异常.下图所示. 期初以为是哪里配置错误,或者版本冲突,经过网上查找办法,完美解 ...

  7. poj2778 AC自动机

    以下内容均为转载,,只有代码是自己写的=-= http://blog.csdn.net/morgan_xww/article/details/7834801   转载地址 博主写的很好 ------- ...

  8. 六、表达式:前缀&&后缀

    count为运算后的值.

  9. Java——删除Map集合中key-value值

    通过迭代器删除Map集合中的key-value值 Iterator<String> iter = map.keySet().iterator(); while(iter.hasNext() ...

  10. Altera的Cyclone系列器件命名规则

    Altera的Cyclone系列器件命名规则如下 器件系列 + 器件类型(是否含有高速串行收发器) +  LE逻辑单元数量 + 封装类型 + 高速串行收发器的数量(没有则不写) + 引脚数目 + 器件 ...