文章分享至我的个人技术博客: https://cainluo.github.io/15018603425788.html
GCD的介绍
GCD
为Grand Central Dispatch
的缩写。
Grand Central Dispatch (GCD)
是苹果爸爸开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并行任务。在Mac OS X 10.6
雪豹中首次推出,也可在iOS 4
及以上版本使用。
为什么要选择GCD
在iOS
开发中, 我们都知道除了GCD
还有NSThread
, NSOperation & NSOperationQueue
, 加上本来就是基于Unix
系统的Pthreads
, 这里就不多说了, 只讲GCD
.
GCD
可以用在多核并行运算GCD
会自动利用更多的CPU内核, 不会有一核有难, 九核围观的情况.GCD
会自动管理线程的生命周期, 比如创建线程, 调度任务, 销毁线程等等操作.- 对我们程序员而已, 就是
GCD
非常的简单, 只需要告诉它去执行什么任务就好了, 管理线程什么的都去死吧.
转载声明:如需要转载该文章, 请联系作者, 并且注明出处, 以及不能擅自修改本文.
GCD的任务和队列
这里要普及两个核心思想: 任务, 队列.
任务
所谓的任务, 就是指我们程序员放在
GCD
里的操作, 一般是用Block
方式进行, 这里有两种执行任务的操作,同步执行
和异步执行
, 两个的区别就是在是否开启新线程进行操作.
同步执行: 在GCD
里是sync
, 不会开启新线程, 只会在当前线程进行操作.
异步执行: 在GCD
里是async
, 可以另外开启一个新的线程执行任务.
队列
队列指的是任务队列, 用来存放任务的队列, 可以说队列是一种比较特殊的线性表, 采用的是先进先出(FIFO)原则, 就像是出高速公路收费站一样, 从最前面一个开始, 排在前面的车子交了费先走, 才到下一个, 这里的队列分为两种,
并行队列
和串行队列
.
并行队列: 全名为Concurrent Dispatch Queue
, 指的是可以让多个任务同时执行, 如果用到并行队列的话, 是会自动开启多个线程同时执行任务.
串行队列: 全名Serial Dispatch Queue
, 指的是任务一个接一个的执行, 完成了前面的那个就到后面那个, 和我们刚刚举的收费站例子一样.
注意: 并行队列只有在异步执行(dispatch_async)才有效.
GCD的使用步骤
其实GCD
的使用非常简单, 两步就完成了.
- 创建队列, 并行, 串行都
OK
- 然后将任务放到队列中, 系统就会根据任务类型来进行异步, 或者是同步执行.
我们先来看看队列, 任务的创建方法.
创建队列
- 这里可以使用
dispatch_queue_create
来创建对象, 这里需要传入两个参数.- 第一个参数: 队列的唯一标识符
- 第二个参数: 队列的类型,
DISPATCH_QUEUE_SERIAL
表示串行队列,DISPATCH_QUEUE_CONCURRENT
表示并行队列.
// 串行队列的创建方法
dispatch_queue_t queue= dispatch_queue_create("Test.queue", DISPATCH_QUEUE_SERIAL);
// 并行队列的创建方法
dispatch_queue_t queue= dispatch_queue_create("Test.queue", DISPATCH_QUEUE_CONCURRENT);
- 关于并行队列, 我们还可以用
dispatch_get_global_queue
来创建全局并行队列
, 也需要传入两个参数.- 第一个参数: 队列的优先级, 一般都是用
DISPATCH_QUEUE_PRIORITY_DEFAULT
. - 第二个参数: 暂时没用, 可以用
0
去代替.
- 第一个参数: 队列的优先级, 一般都是用
创建任务
// 同步执行任务创建方法
dispatch_sync(queue, ^{
// 这里放任务代码
});
// 异步执行任务创建方法
dispatch_async(queue, ^{
// 这里放任务代码
});
基本上这样子就算搞定了, 虽然我们这里就只有两种队列, 但组合起来, 也是不少的:
- 并行队列 + 同步执行
- 并行队列 + 异步执行
- 串行队列 + 同步执行
- 串行队列 + 异步执行
再另外加上一种叫做主队列
的特殊队列, 那就又多了两种组合:
- 主队列 + 同步执行
- 主队列 + 异步执行
这里我们可以看一个表格, 更加的清晰知道各个组合的区别:
并行队列 | 串行队列 | 主队列 | |
---|---|---|---|
同步执行(sync) | 不开启新线程, 串行方式执行任务 | 不开启新线程, 串行方式执行任务 | 不开启新线程, 串行方式执行任务 |
异步执行(async) | 开启新线程, 并行方式执行任务 | 开启1条新线程, 串行方式执行任务 | 不开启新线程, 串行方式执行任务 |
总结
关于GCD
的基本知识, 就讲到这里吧, 更详细的, 后续的文章再补上, 或者可以去看看GCD官方文档自己撸撸也ok~~
最后
码字很费脑, 看官赏点饭钱可好
