Grand Central Dispatch简称(GCD)是由苹果公司开发的技术,是一个非常好的用于多核设备的解决方案。GCD核心在于两个概念:
队列:队列负责管理开发者提交的任务,GCD队列始终以FIFO(先进先出)的方式来处理任务-----但由于处理执行的时间不同,所以先处理的任务并不一定先结束。队列既可以是串行队列,也可以是并发队列,串行队列每次只处理一个任务,必须前一个任务执行完成后,才能执行下一个任务;并发队列则可同时处理多个任务,因此可以多个任务并发处理。
队列底层会维护一个线程池来处理用户提交任务,线程池的作用是执行队列管理的任务。串行队列底层的线程池只是维护一个线程即可,并发队列则需要维护多个线程。
任务:任务就是用户提交给队列的工作单元,这些任务将会给队列底层维护的线程池执行,这些任务会以多线程的方式执行。
使用GCD遵守两个步骤:
1.创建队列。
2.将任务提交给队列。
创建队列:
-》串行队列:串行队列底层的线程池只要一个线程,因此只提供一个线程来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始执行。
-》并发执行:线程池提供多个线程来执行任务,所以可以按FIFO的顺序并发启动、执行多个任务。
(1)获取系统默认的全局并发队列
获取系统默认的全局并发队列:
dispatch_queue_t queue =dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
(2)获取系统主线程关联的串行队列
获取系统主线程关联的串行队列:
dispatch_queue_t queue =dispatch_get_main_queue();就相当于直接在程序主线程中执行任务。
(3)创建串行队列
创建串行队列:
dispatch_queue_t queue =dispatch_queue_create(“ios.queue”,DISPATCH_QUEUE_SERIAL);
如果将多任务提交给串行队列,多任务只能一个一个按顺序执行。
(4)创建并发队列
创建并发队列:
dispatch_queue_t queue =dispatch_queue_create(“ios.queue”,DISPATCH_QUEUE_CONCURRENT);
如果将多个任务提交给并发队列,可以按FIFO的顺序启动多个并发执行任务。
得到队列之后,就可以将任务提交给队列,并由队列底层管理的线程池来执行任务。
提交任务
向队列提交任务:
void dispatch_async(dispatch_queue_t queue,dispatch_block_t block):
将代码块以异步方式提交给指定队列
void dispatch_async_f(dispatch_queue_t queue,void *context,dispatch_function_t work):
将函数以异步方式提交给指定队列
void dispatch_sync(dispatch_queue_t queue,dispatch_block_t block):
将代码块以同步方式提交给指定队列
void dispatch_sync_f(dispatch_queue_t queue,void *context,dispatch_function_t block):
将函数以同步方式提交给指定队列
void dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block):
将代码块以异步方式提交给指定队列,该队列底层的线程池将负责在when指定的时间执行该代码块。
void dispatch_after_f(dispatch_time_t when,dispatch_queue_t queue,void *context,dispatch_function_t work):
将函数以异步方式提交给指定队列,该队列底层的线程池将负责在when指定的时间执行该函数。
void dispatch_apply(size_t iterations,dispatch_queue_t queue,void(^block)(size_t)):
将代码块以异步方式提交给指定队列,该队列底层的线程池将会多次重复执行代码块。
void dispatch_apply(size_t iterations,dispatch_queue_t queue,void context,void(*work)(void ,size_t)):
将函数以异步方式提交给指定队列,该队列底层的线程池将会多次重复执行函数。
void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block):
将代码块提交给指定队列,该队列底层的线程池控制在应用的某个生命周期内仅执行该函数一次。其中predicate参数是一个指向dispatch_once_t(本质就是long型整数)变量的指针,该变量用于判断该代码块是否已经执行过。