GCD是苹果公司为多核的并行运算提出的解决方案,工作时会自动利用更多的处理器核心。使用GCD,系统会完全管理线程,开发者无需编写线程代码。
GCD是Grand Central Dispatch 的缩写,它是基于C语言的。GCD会负责创建线程和调度学要执行的任务,由系统直接提供线程管理。GCD有两个核心概念:队列和任务。
1、队列
Dispatch Queue(队列),它是一个用来存放任务的集合,负责管理开发者提交的任务。队列的核心理念就是将长期运行的任务拆分成多个工作单元,并将这些单元添加到队列中,系统会代为管理这些队列,并放到多个线程上执行,无需开发者直接启动和管理后台线程。
系统提供了许多预定义的队列,包括可以保证始终在主线程上写执行工作的Dispatch Queue,也可以创建自定义的Dispatch Queue,而且可以创建任意多个。队列会维护和使用一个线程池来处理用户提交的任务,线程池的作用就是执行队列管理的任务。GCD的Dispatch Queue严格遵循FIFO(先进先出)原则,添加到Dispatch Queue的工作单元将始终按照加入Dispatch Queue的顺序启动。
需要注意的是:由于每个任务的执行时间各不相同,先处理的任务不一定先结束。
根据任务执行方式不同,队列主要分两种:
(1)Serial Dispatch Queue(串行队列)
串行队列底层的线程池只有一个线程,一次只能执行一个任务,前一个任务执行完成之后,才能够执行下一个任务。
(2)Concurrent Dispatch Queue(并发队列)
并行队列底层的线程池提供了多个线程,可以按照FIFO的顺序并发启动、执行多个任务,这样可以使应用程序的响应性能显著提高。
2、任务
任务就是用户提交给队列的工作单元,也就是代码块,这些任务会交给维护队列的线程池执行,因此这些任务会以多线程的方式执行。
综上,如果要使用GCD实现多线程,仅仅需要两个步骤:
(1)创建队列;
(2)将任务的代码块提交给队列。
创建队列
创建队列需要获取一个dispatch_queue_t类型的对象,iOS提供了多个创建或者访问队列的函数,大体分为3种情况:
1、获取全局并发队列(Global Concurrent Dispatch Queue)
全局并发队列可以同时并行的执行多个任务,但并发队列仍然按照先进先出的顺序来启动任务。并发队列会在前一个任务完成之前就启动下一个任务并开始执行,它同时执行的任务数量会根据应用和系统的动态变化,主要影响因素包括可用核数量、其他进程正在执行的工作数量、其他串行队列中优先任务的数量等。
系统会给每个应用提供多个并发的队列,整个应用内全局共享。开发者不需要显式地创建这些队列,只需要使用dispatch_get_global_queue()函数来获取这些队列,函数定义如下:
dispatch_queue_t dispatch_get_global_queue(long identifier,unsigned long flags);
该函数有两个参数,第2个参数是供以后使用的,传入0即可。第1个参数用于指定队列的优先级,包含4个宏定义的常量,定义格式如下:
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 //高
#define DISPATCH