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~~