什么是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. Mybatis系列二-快速开发

    mybatis学习系列第二篇 分页 在网页中常常用到,在查询数据库内容并想将其输出的时候,因为有时有多组数据,一页展示过于突兀,所以会用到分页操作. 在sql用limit来分页. 首先是UserMap ...

  2. 笨办法学习python之hashmap

    #!/user/bin/env python #-*-coding:utf-8 -*- #Author: qinjiaxi #初始化aMap列表,把列表num_buckets添加到aMap中,num_ ...

  3. 从模块化到认识Babel

    转载自:https://www.cnblogs.com/qcloud1001/p/10167756.html https://blog.csdn.net/a250758092/article/deta ...

  4. Node.js NPM Tutorial

    Node.js NPM Tutorial – How to Get Started with NPM? NPM is the core of any application that is devel ...

  5. Java——分布式

    分布式编程技术的基本思想:客户计算机产生一个请求,然后将这个请求通过网络发送到服务器.服务器处理这个请求,并发送回一个针对该客户端的响应,供客户端进行分析.客户端和服务端之间用代理进行通讯,客户端调用 ...

  6. net core获取appsetting.json的另外一种思路(全局,实时变化无需重启项目)

    最近在写net core的项目,在非controller和service里面需要用到appsetting.json文件里面的一些配置,查资料大概有几种思路: 注入,然后config.GetSectio ...

  7. [杂谈-随口一说]Keep learning!

    随口一说 好些日子没有发表公号文章了, 想说,最近真是忙呢,有时候觉得真忙,有时候还觉得忙的脑子一团乱麻. 原计划的公众号文章将近一个月了一篇没写,时间,都去哪儿了? 周末自己搬家,工作中的任务,学习 ...

  8. Life In Changsha College- 第四次冲刺

    第四次冲刺任务 整体功能实现. 用户故事 用户打开“生活在长大”的界面,选择登录 已注册过则输入用户名和密码直接登录 未注册用户则可选择注册功能,注册成功后登录 登录成功则弹出提示框 进行留言 系统结 ...

  9. Java集合(十)实现Map接口的HashMap

    Java集合(十)继承Map接口的HashMap 一.HashMap简介(基于JDK1.8) HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ...

  10. CVE-2019-7238 poc

    from requests.packages.urllib3.exceptions import InsecureRequestWarning import urllib3 import reques ...