什么是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. 让写作省心一点——Markdown和CSS实践

    1 引言 今天这篇推送和以往不太一样,乍一看就能发现格式有了变化.没错,这是我专门设计的品牌模板,也就是本公众号以后创作的文章可直接套用,获得一致的风格样式. 除此以外,文章里的全部元素(包括标题.表 ...

  2. docker 容器核心技术

    容器的数据卷(volume)也是占用磁盘空间,可以通过以下命令删除失效的volume: [root@localhost]# sudo docker volume rm $(docker volume ...

  3. 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

    机器视觉 machine vision机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完 ...

  4. Linux下几个与磁盘空间和文件尺寸相关的命令

    大家好,我是良许. 硬盘是计算机非常重要的一个部件,不管是代码,还是 UI .声音.文档,抑或是没人时偷偷看的小视频,都需要保存在硬盘里. 对于很多 Linux 服务器,会进行很多的编译操作.而编译操 ...

  5. 汉字统计(hdu2030)

    输入格式:一个整型,再循环带有空格的字符串 思考:用scanf_s()函数输入整型,然后一个大循环,再用gets_s()函数输入带空格的字符串. 注意:scanf_s()函数多加了%c,&d, ...

  6. 掌握了Docker Layer Caching才敢自称精通Dockerfile

    长话短说: 本次原创将向您展示在Docker中使用Layer Cache以加快镜像构建. 这个话题的初衷在于:应用程序打包过程是很慢的(下载并安装框架&第三方依赖包.生成assets),这在D ...

  7. 通用css 常用

    复选框自定义样式input[type="checkbox"] { position: relative; width: 0.75rem; height: 0.75rem; back ...

  8. Kubernetes Ingress简单入门

    作者:Nick Ramirez 原文链接:https://thenewstack.io/kubernetes-ingress-for-beginners/ 本文转载自Rancher Labs 不知道你 ...

  9. 3.Linux如何管理分区

    上一次谈完了硬盘与分区的基础知识,下面谈一下Linux如何管理分区. Linux管理硬件和windows完全不同.任何东西(包括硬件)在Linux看来都是文件设备,有字符和二进制形式的设备.如打印机. ...

  10. This的关键字的使用

    this: 1.可以用来修饰属性  方法 构造器 2.this理解为当前对象或当前正在创建的对象. 3.可以在构造器中通过this()形参的方式显示的调用本类中其他重载的指定的构造器 要求: 在构造器 ...