全称是Grand Central Dispatch,可译为“牛逼的中枢调度器”程序员
纯C语言,提供了很是多强大的函数并发
GCD是苹果公司为多核的并行运算提出的解决方案异步
GCD会自动利用更多的CPU内核(好比双核、四核)async
GCD会自动管理线程的生命周期(建立线程、调度任务、销毁线程)函数
程序员只须要告诉GCD想要执行什么任务,不须要编写任何线程管理代码spa
任务:执行什么操做线程
队列:用来存听任务code
肯定想作的事情
生命周期
GCD会自动将队列中的任务取出,放到对应的线程中执行队列
任务的取出遵循队列的FIFO原则:先进先出,后进后出
GCD中有2个用来执行任务的函数
用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); queue:队列 block:任务 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
同步和异步的区别
同步:在当前线程中执行 异步:在另外一条线程中执行
可让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
并发功能只有在异步(dispatch_async)函数下才有效
让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
同步:在当前线程中执行任务,不具有开启新线程的能力
异步:在新的线程中执行任务,具有开启新线程的能力
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
GCD默认已经提供了全局的并发队列,供整个应用使用,不须要手动建立
使用dispatch_get_global_queue函数得到全局的并发队列 dispatch_queue_t dispatch_get_global_queue( dispatch_queue_priority_t priority, // 队列的优先级 unsigned long flags); // 此参数暂时无用,用0便可 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 得到全局并发队列
全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中) #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
使用dispatch_queue_create函数建立串行队列
dispatch_queue_t dispatch_queue_create(const char *label, // 队列名称 dispatch_queue_attr_t attr); // 队列属性,通常用NULL便可 dispatch_queue_t queue = dispatch_queue_create("cn.itcast.queue", NULL); // 建立 dispatch_release(queue); // 非ARC须要释放手动建立的队列
使用主队列(跟主线程相关联的队列)
主队列是GCD自带的一种特殊的串行队列 放在主队列中的任务,都会放到主线程中执行 使用dispatch_get_main_queue()得到主队列 dispatch_queue_t queue = dispatch_get_main_queue();
全局并发队列 | 手动建立串行队列 |
主队列 | |
同步(sync) |
|
|
|
异步(async) |
|
|
|
从子线程回到主线程 dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行耗时的异步操做... dispatch_async(dispatch_get_main_queue(), ^{ // 回到主线程,执行UI刷新操做 }); });