引言
在iOS的一系列API中,GCD可谓一等公民,由于其简洁性和易用性,在多线程的学习和使用中GCD也成为必不可少的一部分。
很多初学者可能搞不清楚queue和线程之间的关系,或者干脆把queue当作线程来看,其实这种理解是非常不正确的,在此我们就对GCD和线程做一个简单的整理。
队列与线程
首先我们对相关的几个名词做一下名词解释:
- GCD
全称Grand Central Dispatch,中文译作大中枢派发系统,用来处理多任务与多线程的派发与执行。 - queue
用于存储任务的队列,遵循先进先出原则,也就是先加入的任务先执行后加入的任务后执行,队列中的任务可分配到多个线程中。 - 线程
具体处理各任务的计算与执行,单个线程同一时间只能处理一个任务。
GCD的队列可以分为三种类型:
主队列
队列中的任务只会在主线程执行并发队列
队列中的任务可以按先后顺序试线程空闲情况分配到多个线程中,队列中的任务可以并发执行并且完成的顺序不定。串行队列
队列中的任务按照FIFO(先进先出)的顺序分配到线程中,一个完成后再继续下一个,线程中的任务不会同时进行,从而完成顺序也是固定的。
主队列可通过dispatch_get_main_queue()获取,并发队列和串行队列可通过dispatch_queue_create函数创建。
dispatch_get_global_queue函数返回的队列为并发队列,并且可以通过指定dispatch_queue_priority_t获取不同优先级的队列,优先级DISPATCH_QUEUE_PRIORITY_HIGH>DISPATCH_QUEUE_PRIORITY_DEFAULT>DISPATCH_QUEUE_PRIORITY_LOW>DISPATCH_QUEUE_PRIORITY_BACKGROUND,高优先级队列的中的任务会先执行,该队列所有任务完成之后再继续进行下一优先级队列中的任务。
向队列中添加任务的方式分为同步和异步两种:
异步
不会阻塞当前线程,添加后会继续执行后面的代码。同步
阻塞当前线程,添加后会一直等待任务完成,完成后继续执行后面的代码。