1.简介
1.1 GCD官方解释
Grand Central Dispatch(GCD)是异步执行任务的技术之一,一般将应用程序中记述的线程管理用的代码再系统级中实现。开发者只需要定义想执行的任务并追加到适当的 Dispatch Queue 中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样就比以前的线程更有效率。
1.2 GCD的好处
- GCD可用于多核的并行运算
- GCD会自动利用更多的CPU内核(比如双核、四核)
- GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
- 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
2.任务和队列
学习GCD之前,我们要了解GCD中两个核心概念:任务和队列。
2.1 任务
任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码。在GCD中是放在block中的。执行任务有两种方式:同步执行和异步执行。两者的主要区别是是否具备开启新线程的能力。
- 同步执行:只能在当前线程中执行任务,不具备开启新线程的能力。
- 异步执行:可以在新的线程中执行任务,具备开启新线程的能力。
2.2 队列
队列:这里的队列指任务队列,即用来存放任务的队列。队列是一种特殊的线性表,采用FIFO(先进先出)的原则,即新任务总是被插入到队列的末尾,而读取任务的时候总是从队列的头部开始读取。每读取一个任务,则从队列中释放一个任务。在GCD中有两种队列:串行队列和并行队列。
- 并行队列:可以让多个任务并行(同时)执行(自动开启多个线程同时执行任务),并行功能只有在异步函数下才有效。
- 串行队列:让任务一个接着一个的执行(一个任务执行完毕后,再执行下一个任务)
3.GCD的使用步骤
GCD的使用步骤其实很简单,只有两步。
1.创建一个队列(串行队列或并行队列)
2.将任务添加到队列中,然后系统就会根据任务类型执行任务(同步执行或异步执行)
3.1 队列的创建方法
可以使用 dispatch_queue_create 来创建对象,需要传入两个参数,第一个参数表示队列的唯一标识符,用于Debug,可为空;第二个参数用来识别是串行队列还是并行队列。DISPATCH_QUEUE_SERIAL 表示串行队列,DISPATCH_QUEUE_CONCURRENT 表示并行队列。
1
2
3
4
|
// 串行队列的创建方法
dispatch_queue_t queue= dispatch_queue_create(
"test.queue"
, DISPATCH_QUEUE_SERIAL);
// 并行队列的创建方法
dispatch_queue_t queue= dispatch_queue_create(
"test.queue"
, DISPATCH_QUEUE_CONCURRENT);
|
在下图中,我们可以看到,唯一标识符的作用,在Debug时,更容易确定是哪个线程除了问题。
对于并行队列,还可以使用 dispatch_get_global_queue 来创建全局并行队列。GCD默认提供了全局的并行队列,需要传入两个参数。第一个参数表示队列优先级,一般用DISPATCH_QUEUE_PRIORITY_DEFAULT,第二个参数暂时没用,用0即可。