Dispatch
2017-10-27 本文已影响0人
吃面多放葱
DispatchQueue
该类管理任务项的执行.每个提交到一个队列中的任务项将被系统管理的线程池处理.
测试Demo
同步和异步执行
每个任务项可以被同步或者异步执行.当一个任务项使用同步方法执行时,程序会直到执行项执行完毕才返回.当一个任务项使用异步方法执行时,异步方法会马上返回
串行和并行队列
一个分发队列可以是串行队列,任务项一次只能执行一个.或者是并行队列,任务项目被序列化,但是却可以一次全部运行或者在任何顺序下终止.
串行或者并行队列处理工作项都遵循FIFO原则
重要
尝试同步执行工作项在主队列容易导致死锁.
全局队列(global concurrent queue)
全局队列是并行队列,系统创建了许多全局队列供程序使用
DispatchQueue
Dispatchqueue 管理任务项的执行。每个提交到队列中的任务项被系统管理的线程池处理。
常用方法
实例创建
init(__label: UnsafePointer<Int8>?, attr: __OS_dispatch_queue_attr?)
参数介绍
label: com.example.myqueue (可不填),主要功能是标记线程,方便调试。
attr : DISPATCH_QUEUE_SERIAL; DISPATCH_QUEUE_CONCURRENT; 标明创建的是串行队列还是并行队列。
init(label: String, qos: DispatchQoS, attributes: DispatchQueue.Attributes, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency, target: DispatchQueue?)
参数介绍
attributes: concurrent 可以用来创建并行队列
QoS : 枚举(unspecified,background,utility,default,userInitiated,userInterractive)
优先级从低到高,在有优先级需求的时候使用.
target: 可以将队列添加到一个某个目标队列,最终将在目标队列执行。
实例方法
同步方法
// 提交block到一个队列中执行,直到那个block完成。
func sync(execute: () -> Void)
func sync(execute: DispatchWorkItem)
异步方法
func async(execute: DispatchWorkItem)
类属性
class var main: DispatchQueue
类方法
class func concurrentPerform(iterations: Int, execute work: (Int) -> Void)
iterations: 迭代次数
其他方法
func setTarget(queue: DispatchQueue?)
参数说明: 对象所在的新的目标队列.这个队列引用加一,之前所在队列,如果可能的话,将被释放.这个参数不能为NULL
讨论
目标队列为对象处理负责.目标队列决定了对象的析构器的调用.更改对象的目标队列会改变他们的行为.
如果提交一个block到串行队列,串行队列的目标队列是一个不同的串行队列,该Block不会与提交到目标队列的其他Block并发调用或者说其他与该队列拥有相同目标队列的队列并发执行.
Dispatch souces: 分发源的目标队列明确了(事件处理和取消)的位置.
全局队列明确优先级,获取一个具有优先级别的全局队列.
class func global(qos: DispatchQoS.QoSClass)
用一个表格来表示串并行队列同步异步执行的情况
同步执行 | 异步执行 | |
---|---|---|
串行队列 | 当前线程,一个一个执行 | 其他线程,一个一个执行 |
并行队列 | 当前线程,一个一个执行 | 多个线程,一起执行 |
DispatchWorkItem
DispatchWorkItem包含能够被执行的任务。一个任务项能够被分配至DispatchQueue 和 DispatchGroup.一个任务项也能被置为一个DispatchSource 事件,注册项,或者错误处理。
实例化
init(qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, block: @escaping () -> Void)
参数介绍
Qos: 同上
flags: 任务项的性质,是否要创建新线程,或者创建barrior。
关于barrior需要描述一下,网上查找的资料描述: 只针对一个并行队列.同步点之前的任务,会并发执行,到了同步点就会等待,等待同步点的任务执行完成的时候,继续后面的任务,再次并发执行
项目中主要还是用到它的创建方法,其他略。
DispatchTime
DispatchTime代表与具有纳秒(十亿分之一秒)精度的时钟相关的一个时间点。
实例方法
// 创建后即开始启动计时。
init(uptimeNanoseconds: UInt64)
实例属性
// 返回创建以来到当前时间的纳秒数,包含系统休眠的时间。
var uptimeNanoseconds: UInt64
类属性
static let distantFuture: DispatchTime
类方法
// 返回当前时间
static func now()
DispatchTimeInterVal
枚举类 使用其值来确定DispatchSourceTimer启动或者I/O处理的时间间隔。
(未完待续)