美文网首页
GCD的基本使用(二)

GCD的基本使用(二)

作者: 沈正方 | 来源:发表于2017-04-03 14:18 被阅读103次

一. 函数执行任务

  • GCD中有2个用来执行任务的常用函数
    • 用同步的方式执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
queue:队列
block:任务
- 用异步的方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
- 同步和异步的区别
  + 同步:只能在当前线程中执行任务,不具备开启新线程的能力
  + 异步:可以在新的线程中执行任务,具备开启新线程的能力
  • GCD中还有个用来执行任务的栅栏函数:
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

二. 并发队列

  • 使用dispatch_queue_create函数创建并发队列
//const char * _Nullable label:队列名称(必须唯一:com.baidu.queue)
//dispatch_queue_attr_t  _Nullable attr:队列的类型
dispatch_queue_t queue = dispatch_queue_create(<#const char * _Nullable label#>, <#dispatch_queue_attr_t  _Nullable attr#>)
  • GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建
//<#long identifier#>:队列的优先级
//<#unsigned long flags#>:此参数未来使用,用0即可
dispatch_queue_t queue = dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)

三. 串行队列

  • GCD中获得串行有2种途径
    1. 使用dispatch_queue_create函数创建串行队列
//const char * _Nullable label:队列名称(必须唯一:com.baidu.queue)
//dispatch_queue_attr_t  _Nullable attr:队列类型传递NULL或者DISPATCH_QUEUE_SERIAL
dispatch_queue_t queue = dispatch_queue_create(<#const char * _Nullable label#>, <#dispatch_queue_attr_t  _Nullable attr#>)
2. 使用主队列(跟主线程相关联的队列)
dispatch_queue_t queue = dispatch_get_main_queue()
  + 主队列是GCD自带的一种特殊的串行队列
  + 放在主队列中的任务,都会放到主线程中执行

四. 函数+队列

  • 异步函数+并发队列:开启多条线程,并发执行任务
  • 异步函数+串行队列:开启一条线程,串行执行任务
    • 同步函数+并发队列:不开线程,串行执行任务
    • 同步函数+串行队列:不开线程,串行执行任务
      • 异步函数+主队列:不开线程,在主线程中串行执行任务
      • 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)
      • 注意:同步函数和异步函数在执行顺序上面的差异

五. 使用Crearte函数创建的并发队列全局并发队列的主要区别

  • 全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级、默认优先级、低优先级和后台优先级一共四个并发队列,我们只是选择其中的一个直接拿来用。
  • Create函数是实打实的从头开始去创建一个队列。
  • 在iOS6.0之前,在GCD中凡是使用了带Createretain的函数在最后都需要做一次release操作。而主队列和全局并发队列不需要我们手动release
    • 当然了,在iOS6.0之后GCD已经被纳入到了ARC的内存管理范畴中,即便是使用retain或者create函数创建的对象也不再需要开发人员手动释放,我们像对待普通OC对象一样对待GCD就OK。
  • 在使用栅栏函数的时候,苹果官方明确规定栅栏函数只有在和使用create函数自己的创建的并发队列一起使用的时候才有效(没有给出具体原因)其它区别涉及到XNU内核的系统级线程编程,不一一列举。
  • 一些参考资料(自行研究):

相关文章

  • GCD的基本使用(二)

    一.线程间通信 二.GCD常用函数 还需补充.

  • GCD的基本使用(二)

    一. 函数执行任务 GCD中有2个用来执行任务的常用函数用同步的方式执行任务 GCD中还有个用来执行任务的栅栏函数...

  • iOS-多线程:GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(6种不同组合区别) GCD 线程间的通信...

  • GCD的简单使用

    一. GCD基本知识 两个核心概念 队列和任务 同步函数和异步函数 二. GCD基本使用 异步函数+并发队列 : ...

  • 浅析多线程GCD

    GCD的基本使用代码

  • iOS GCD基本使用(二)

    //异步函数+并发队列会开启多条线程,异步执行- (void)asyncConcurrent{//1.创建队列//...

  • 多线程和AFN网络框架配合使用

    ios的多线程一般有NSOperation和GCD.NSOperation基本使用: GCD基本使用: 简单的多线...

  • iOS多线程--彻底学会多线程之『GCD』

    GCD 文章目录 GCD简介 任务和队列 GCD的使用步骤 队列的创建方法 任务的创建方法 GCD的基本使用 并行...

  • 多线程之GCD

    GCD介绍 1、GCD简介 2、GCD任务和队列 3、GCD 的基本使用 4、GCD 线程间的通信 5、GCD 的...

  • iOS GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(六种组合不同区别,队列嵌套情况区别,相互...

网友评论

      本文标题:GCD的基本使用(二)

      本文链接:https://www.haomeiwen.com/subject/hhanottx.html