1、GCD(Grand Central Dispatch)可理解为:“牛逼的中心调度”
·Apple提供的一套更底层、更高效的并发编程技术,纯C语言、基于Block ·支持同步或异步任务处理,串行、并行的处理队列,非系统调用的信号量机制,定时任务处理,进程、文件或网络的监听任务等
优点
·易用: GCD比之thread更简单易用。基于block的特性导致它能简单的在不同代 码作用域之间传递上下文
·效率: GCD实现功能 轻量、优雅,使得它在很多地方比之专门创建消耗资源的线程更 实用且快速
·性能: GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率
·安全: 无需加锁或其他同步机制
2、Dispatch Queue
Dispatch Queue是执行处理的等待队列,通过dispatch_async等函数,按照先进先出(FIFO)顺序追加到Queue中执行处理时,存在两种 Dispatch Queue:
·Serial Dispatch Queue --- 需等待现在正在执行的任务处理结束(串行)
·Concurrent Dispatch Queue --- 不需等待现在正在执行的任务处理结束(并发)
·Main Dispatch Queue(dispatch_get_main_queue)
a) 主队列,在主线程里执行的队列。因为主线程只有一个,所以 Main Dispatch
Queue属于Serial Dispatch Queue
b) 一切跟UI有关的操作必须放在主线程中执行,所以要追加到Main Dispatch Queue
·Global Dispatch Queue(dispatch_get_global_queue)全局队列,所有应用程序都能够使用的 Concurrent Dispatch Queue
3、GCD的使用
a) 添加任务
·dispatch_async 提交一个异步执行的block块
·dispatch_sync 提交一个同步执行的block块
注意:使用 dispatch_sync 容易引起死锁,慎重使用。比如在主线程里面执行 往主队列里面添加任务的操作就会引起死锁
b) 延迟任务 dispatch_after
·dispatch_after 等待指定的时间后异步的添加一个block块到指定队列里面,不堵塞
当前线程。
c) 一次任务 dispatch_once
·保证dispatch_once中的代码块在应用程序里面只执行一次
d) 设置队列优先级 dispatch_set_target_queue
DISPATCH_QUEUE_PRIORITY_HIGH 2
DISPATCH_QUEUE_PRIORITY_DEFAULT 0
DISPATCH_QUEUE_PRIORITY_LOW (-2)
DISPATCH_QUEUE_PRIORITY_BACKGROUND
e) 挂起任务 dispatch_suspend
f) 恢复任务 dispatch_resume
g) 多元调用(迭代)
·dispatch_apply 提交一个多元调用的block块到队列里面,并且等待block任务的所
有迭代 完成之后才返回
·dispatch_group_async 监视一组block任务的完成,多个任务都结束后 的一个汇总
处理,可以同步或异步地监视
·dispatch_group_notify 所有任务执行结束汇总,不阻塞当前线程 ·dispatch_group_wait 等待直到所有任务执行结束,中途不能取消,阻塞当前线程
4、NSRunloop的基本概念
·Run Loop 是线程相关的的基础框架的一部分。一个 run loop 就是一个事件处理 的循环,用来不停的调度工作以及处理输入事件。
·线程的生命周期存在五个状态:新建、就绪、运行、阻塞、死亡 ·NSRunLoop可以保持一个线程一直为活动状态,不会马上销毁掉
注意:主线程中的RunLoop默为YES
·Apple提供的一套更底层、更高效的并发编程技术,纯C语言、基于Block ·支持同步或异步任务处理,串行、并行的处理队列,非系统调用的信号量机制,定时任务处理,进程、文件或网络的监听任务等
优点
·易用: GCD比之thread更简单易用。基于block的特性导致它能简单的在不同代 码作用域之间传递上下文
·效率: GCD实现功能 轻量、优雅,使得它在很多地方比之专门创建消耗资源的线程更 实用且快速
·性能: GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率
·安全: 无需加锁或其他同步机制
2、Dispatch Queue
Dispatch Queue是执行处理的等待队列,通过dispatch_async等函数,按照先进先出(FIFO)顺序追加到Queue中执行处理时,存在两种 Dispatch Queue:
·Serial Dispatch Queue --- 需等待现在正在执行的任务处理结束(串行)
·Concurrent Dispatch Queue --- 不需等待现在正在执行的任务处理结束(并发)
·Main Dispatch Queue(dispatch_get_main_queue)
a) 主队列,在主线程里执行的队列。因为主线程只有一个,所以 Main Dispatch
Queue属于Serial Dispatch Queue
b) 一切跟UI有关的操作必须放在主线程中执行,所以要追加到Main Dispatch Queue
·Global Dispatch Queue(dispatch_get_global_queue)全局队列,所有应用程序都能够使用的 Concurrent Dispatch Queue
3、GCD的使用
a) 添加任务
·dispatch_async 提交一个异步执行的block块
·dispatch_sync 提交一个同步执行的block块
注意:使用 dispatch_sync 容易引起死锁,慎重使用。比如在主线程里面执行 往主队列里面添加任务的操作就会引起死锁
b) 延迟任务 dispatch_after
·dispatch_after 等待指定的时间后异步的添加一个block块到指定队列里面,不堵塞
当前线程。
c) 一次任务 dispatch_once
·保证dispatch_once中的代码块在应用程序里面只执行一次
d) 设置队列优先级 dispatch_set_target_queue
DISPATCH_QUEUE_PRIORITY_HIGH 2
DISPATCH_QUEUE_PRIORITY_DEFAULT 0
DISPATCH_QUEUE_PRIORITY_LOW (-2)
DISPATCH_QUEUE_PRIORITY_BACKGROUND
e) 挂起任务 dispatch_suspend
f) 恢复任务 dispatch_resume
g) 多元调用(迭代)
·dispatch_apply 提交一个多元调用的block块到队列里面,并且等待block任务的所
有迭代 完成之后才返回
dispatch_async(dispatch_get_global_queue(0, 0), ^{
/*
<#size_t iterations#>:迭代次数
queue:迭代的队列
<#^(size_t)block#>:迭代过程汇总每次要做的事情
*/
dispatch_apply(array.count, dispatch_get_global_queue(0, 0), ^(size_t i) { //i:迭代的变量
NSNumber *number = array[i];
NSLog(@"%.2f",[number floatValue]);
});
});
h) 组任务
·dispatch_group_async 监视一组block任务的完成,多个任务都结束后 的一个汇总
处理,可以同步或异步地监视
·dispatch_group_notify 所有任务执行结束汇总,不阻塞当前线程 ·dispatch_group_wait 等待直到所有任务执行结束,中途不能取消,阻塞当前线程
4、NSRunloop的基本概念
·Run Loop 是线程相关的的基础框架的一部分。一个 run loop 就是一个事件处理 的循环,用来不停的调度工作以及处理输入事件。
·线程的生命周期存在五个状态:新建、就绪、运行、阻塞、死亡 ·NSRunLoop可以保持一个线程一直为活动状态,不会马上销毁掉
注意:主线程中的RunLoop默为YES