GCD(Grand Central Dispatch) 介绍
-
纯C语言
,提供例如非常强大的函数 -
优势:
-
GCD是苹果公司为
多核的并行运算
提出的解决方案 -
GCD会
自动利用更多的CPU内核
(比如双核、四核) -
GCD会自
动管理线程的生命周期
(创建线程、调度任务、销毁线程) -
程序员只需要
告诉GCD想要执行什么任务
,不需要编写任何线程管理代码
-
GCD 函数
- 任务使⽤
block
封装 - 任务的 block
没有参数也没有返回值
- 执⾏任务的函数
异步 dispatch_async
- 异步
dispatch_async
不⽤等待当前语句执⾏完毕,就可以执⾏下⼀条语句
- 会开启线程执⾏ block 的任务
- 异步是多线程的代名词
同步 dispatch_sync
- 同步
dispatch_sync
,必须等待当前语句执⾏完毕,才会执⾏下⼀条语句 - 不会开启线程
- 在当前执⾏ block 的任务
GCD 队列
队列分为穿行队列
、并发队列
穿行队列(DISPATCH_QUEUE_SERIAL
)
-任务串行执行,一个接一个
并发队列(DISPATCH_QUEUE_CONCURRENT
)
- 并发队列:一次可以并发执行多个任务,即开启多个线程,并同时执行任务
- 并发队列的并发功能
只有在异步函数下才有效
GCD 函数与队列的关系
同步函数串行队列
不会开启线程,在当前线程执行任务
-
任务串行执行
,一个接一个 会产生堵塞
同步函数并发队列
不会开启线程,在当前线程执行任务
-
任务串行执行
,一个接一个
异步函数串行队列
- 开一条新线程
- 任务一个接一个
异步函数并发队列
- 开线程,在当前线程执行
- 任务异步执行,没有顺序,CPU调度有关
主队列同步函数
- 相互等待,
死锁
主线程因为你同步函数的原因等着先执⾏任务
主队列等着主线程的任务执⾏完毕再执⾏⾃⼰的任务
主队列和主线程相互等待会造成死锁
GCD 主队列与全局队列
主队列(dispatch_get_main_queue();
)
-
专⻔⽤来在主线程上调度任务的串⾏队列
-
不会开启线程
-
如果当前主线程正在有任务执⾏,那么⽆论主队列中当前被添加了什么任务,都不会被调度
全局并发队列(dispatch_get_global_queue(0, 0)
)
-
为了⽅便程序员的使⽤,苹果提供了全局队列
-
全局队列是⼀个并发队列
-
在使⽤多线程开发时,
如果对队列没有特殊需求,在执⾏异步任务时,可以直接使⽤全局队 列
-
dispatch_get_global_queue(0, 0)
- 第一个参数表示队列优先级,默认优先级为
DISPATCH_QUEUE_PRIORITY_DEFAULT=0
,在ios9之后,已经被服务质量(quality-of-service)取代
- 第一个参数表示队列优先级,默认优先级为
//全局并发队列的获取方法
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
//优先级从高到低(对应的服务质量)依次为
- DISPATCH_QUEUE_PRIORITY_HIGH -- QOS_CLASS_USER_INITIATED
- DISPATCH_QUEUE_PRIORITY_DEFAULT -- QOS_CLASS_DEFAULT
- DISPATCH_QUEUE_PRIORITY_LOW -- QOS_CLASS_UTILITY
- DISPATCH_QUEUE_PRIORITY_BACKGROUND -- QOS_CLASS_BACKGROUND
- 第二个参数使用0
常规使用
//主队列 + 全局并发队列的日常使用 dispatch_async(dispatch_get_global_queue(0, 0), >^{ //执行耗时操作 dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程进行UI操作 }); });
GCD常用函数
-
dispatch_queue_create(<#const char * _Nullable label#>, <#dispatch_queue_attr_t _Nullable attr#>);
创建队列- 第一个参数传
队列名称
- 第二个参数传
队列类型
- 串行:
DISPATCH_QUEUE_SERIAL
,NULL
- 并行
DISPATCH_QUEUE_CONCURRENT
- 串行:
- 第一个参数传
-
异步函数
dispatch_async(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)
- 第一个参数传
创建的队列(dispatch_queue_t)
- 第二个参数传
要执行的代码块
- 第一个参数传
-
同步函数
dispatch_sync(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)
- 第一个参数传
创建的队列(dispatch_queue_t)
- 第二个参数传
要执行的代码块
- 第一个参数传
-
获取主队列
dispatch_get_main_queue()
-
获取全局并发队列
dispatch_get_global_queue(<#intptr_t identifier#>, <#uintptr_t flags#>)
网友评论