ios - GCD (1)

1.什么是GCD?

GCD (Grand Central Dispatch) 是异步执行任务的技术之一,以非常简洁的语法实现了复杂繁琐的多线程编程。

使用GCD的语法如下:

dispatch_async(queue, ^{

  //在后台 执行耗时的操作处理,处理完毕后调用主线程更新用户界面

  dispatch_async(dispatch_get_main_queue(), ^{

      //主线程同步,例如更新用户界面

   });

});


2.Dispatch_Queue

GCD中有2种类型队列,Serial Dispatch Queue 和 ConcurrentDispatch Queue。

1) Serial Dispatch Queue

串行队列,按照任务顺序执行处理,在同一时间执行一个任务,如下图:


串行队列工作模式


Serial Dispatch Queue 不使用锁,可以解决多线程中 “数据竞争”的问题,如下图:


数据竞争问题


iOS 中的UI主线程队列 是Serial Dispatch Queue 类型,创建一个Serial Dispatch Queue时,系统会为此队列创建一个线程,比如创建5个Serial Dispatch Queue此时系统就会创建5个线程,过多的创建会消耗大量内存,引起大量上下文切换,大幅降低系统相应性能。


2) Concurrent Dispatch Queue

并行队列,队列中执行的任务顺序是不固定的,如下图:


并行队列工作模式


Concurrent Disaptch Queue 使用XNU内核来管理线程,不会发生Serial Dispatch Queue的问题。如果操作中不存在"数据竞争" 问题,请使用Concurrent Dispatch Queue。


3.创建队列

1) 使用dispatch_queue_create

创建Serial Dispatch Queue

dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("queue identity", nil);

创建Concurrent Dispatch Queue

dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("queue identity", DISPATCH_QUEUE_CONCURRENT);

参数1 :队列的标示(建议identity定义的规范,在输出错误日志调试时非常有用)

参数2: 队列类型,nil 代表 Serial 队列 , DISPATCH_QUEUE_CONCURRENT代表 Concurrent 队列

*具体信息可查阅苹果官方的帮助文档

2) 使用系统标准提供的 Dispatch Queue 来创建

dispatch_get_global_queue()

dispatch_get_main_queue()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 GCD(Grand Central Dispatch)是在macOS10.6提出来的,后来在iOS4.0被引...
    sunmumu1222阅读 914评论 0 2
  • 这篇主要写的是1、同异步派发(dispatch_async、dispatch_sync)2、串并行队列(DISPA...
    guoshengboy阅读 220评论 0 0
  • 1. GCD简介 什么是GCD呢?我们先来看看百度百科的解释简单了解下概念 引自百度百科:Grand Centra...
    千寻_544f阅读 420评论 0 0
  • iOS中GCD的使用小结 作者dullgrass 2015.11.20 09:41*字数 4996阅读 20199...
    DanDanC阅读 947评论 0 0
  • 我们知道在iOS开发中,一共有四种多线程技术:pthread,NSThread,GCD,NSOperation: ...
    请叫我周小帅阅读 1,517评论 0 1