什么是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. HTML学习——day1

    HTML是一种用于创建网页的标准标记语 注意:对于中文网页需要使用<meta charset=''utf-8''>声明编码,否则会出现乱码. HTML标签 <标签>内容< ...

  2. React中父子组件数据传递

    Vue.js中父子组件数据传递:Props Down ,  Events Up Angular中父子组件数据传递:Props Down,  Events  Up React中父子组件数据传递:Prop ...

  3. 2.7 Go交叉编译

    Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED= ...

  4. python基本数据类型:字符串及其方法(一)

    大小写转换类 方法一:capitalize()首字母大写字符串 name='hatusne miku' name1=name.capitalize() print(name,name1) 方法二:ti ...

  5. MYSQL(1)— 初识MySQL

    一.MySQL [官网文档]https://dev.mysql.com/doc/refman/8.0/en/ 1-1.Mysql是一个关系型数据库,里面的表数据是可以有联系的,例如多对一,一对多. 1 ...

  6. Spring全家桶一一SpringBoot与Mybatis

    Spring全家桶系列一一SpringBoot与Mybatis结合 本文授权"Java知音"独家发布. Mybatis 是一个持久层ORM框架,负责Java与数据库数据交互,也可以 ...

  7. PHP 操作结果集对象方法

    <?php header('Content-type:text/html;charset=utf-8'); //建立 或者 关闭mysql服务器 @符号用于屏蔽错误信息 $link=@mysql ...

  8. LeetCode树专题

    LeetCode树专题 98. 验证二叉搜索树 二叉搜索树,每个结点的值都有一个范围 /** * Definition for a binary tree node. * struct TreeNod ...

  9. ketchup服务治理

    ketcup  git地址:https://github.com/simple-gr/ketchup 服务治理是什么 企业为了确保事情顺利完成而实施的过程,包括最佳实践.架构原则.治理规程.规律以及其 ...

  10. 计算机启动 Ubuntu系统初始化 SysV Systemd

    计算机启动过程 第一阶段:BIOS boot (bootstrap的缩写)来自一句谚语:"pull oneself up by one's bootstraps" 最早的时候,计算 ...