-
DispatchQueue
分为串行和并发,它的完整初始化方法为:
DispatchQueue.init(label: String, qos: DispatchQoS, attributes: DispatchQueue.Attributes, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency, target: DispatchQueue?)
可见,这些参数中,除了label,其它都有默认值(label表示该队列的标签,建议传值为反向域名字符串,如:com.onevcat.Kingfisher.Animator.preloadQueue
)。
当除label外的参数都使用默认值时,初始化方法返回的便是串行队列。如果需要返回并发队列,参数attributes传值为.concurrent即可。DispatchQueue.Attributes 是一个结构体类型,该结构体提供了两个静态变量:concurrent和initiallyInactive(注意,没有代表串行队列的静态变量)。如果attributes参数传值为initiallyInactive, 任务不会自动执行,而是需要开发者手动调用activate()触发。但是代码依然是串行进行的,如果想要手动触发、并行执行任务,可以指定attributes参数接受一个数组: [.concurrent, .initiallyInactive]。
DispatchQoS:是一个结构体 代表队列的优先级,有6中可选值.优先级从高到低依次为
public static let userInteractive: DispatchQoS
public static let userInitiated: DispatchQoS
public static let utility: DispatchQoS
public static let background: DispatchQoS
//default和unspecified优先级介于userInteractive和background
//之间,具体优先级有系统决定.
public static let `default`: DispatchQoS
public static let unspecified: DispatchQoS
DispatchQueue.AutoreleaseFrequency有三种属性值:.inherit、.workItem和.never。
- .inherit:不确定,之前默认的行为也是现在的默认值
- .workItem:为每个执行的任务创建自动释放池,项目完成时清理临时对象
- .never:GCD不为您管理自动释放池
参数target 用于指定即将创建的队列与队列target优先级相同。也可通过setTarget(queue: DispatchQueue?)函数指定与queue相同的优先级。
除了开发者自己创建队列,还可以通过DispatchQueue.main获取主队列(主队列也属于串行队列)、DispatchQueue.global(qos: DispatchQoS.QoSClass) 获取全局并发队列。