1. 自己创建队列
构造函数
/*
- label : 队列的名称 - attributes : 队列的属性
* public static let serial: DispatchQueueAttributes // 串行
* public static let concurrent: DispatchQueueAttributes // 并发
* public static let initiallyInactive: DispatchQueueAttributes
* public static let autoreleaseInherit: DispatchQueueAttributes
* public static let autoreleaseWorkItem: DispatchQueueAttributes
* public static let autoreleaseNever: DispatchQueueAttributes
* public static let qosUserInteractive: DispatchQueueAttributes // 用户交互(希望尽快完成,用户很希望得到结果。个人觉得这个和主线的的线程优先级是一样的)
* public static let qosUserInitiated: DispatchQueueAttributes // 用户期望优先级(不要放太耗时的操作)
* public static let qosDefault: DispatchQueueAttributes // 默认优先级(一般不是给程序员实用的,用来重置队列用的)
* public static let qosUtility: DispatchQueueAttributes // 实用工具优先级别(耗时操作,可以使用这个)
* public static let qosBackground: DispatchQueueAttributes // 后台优先级
(只有最前的两个牵扯到队列的 串行和并行。 其余的都和线程的优先级设置有关)
- DispatchQueue : 队列(没有相关文字说明这是干什么的)
*/
public convenience init(label: String, attributes: DispatchQueueAttributes = default, target: DispatchQueue? = default)
2. 全局队列的一些说明
/** 类方法提供了默认的参数,当我们给不传参数的时候,使用的是默认参数;
attributes: DispatchQueue.GlobalAttributes = default :
*/
public class func global(attributes: DispatchQueue.GlobalAttributes = default) -> DispatchQueue // 获取主队列的参数 结构体
public struct GlobalAttributes : OptionSet {
public let rawValue: UInt64
public init(rawValue: UInt64)
// 服务质量
public static let qosUserInteractive: DispatchQueue.GlobalAttributes
public static let qosUserInitiated: DispatchQueue.GlobalAttributes
public static let qosDefault: DispatchQueue.GlobalAttributes
public static let qosUtility: DispatchQueue.GlobalAttributes
public static let qosBackground: DispatchQueue.GlobalAttributes
// 在 swift3.0 中已经废弃了的 ,除了第一个以外和上面是一一对应的。
public static let priorityHigh: DispatchQueue.GlobalAttributes
public static let priorityDefault: DispatchQueue.GlobalAttributes
public static let priorityLow: DispatchQueue.GlobalAttributes
public static let priorityBackground: DispatchQueue.GlobalAttributes
}
// 这一段大家应该很熟悉。老版本的 objc 中 GCD 的文档说明
* It is recommended to use quality of service class values to identify the
* well-known global concurrent queues:
* 推荐使用服务质量类去标识 全局并发队列
* - QOS_CLASS_USER_INTERACTIVE // 用户交互(希望尽快完成,用户对结果比较期望,不能放耗时操作 (我觉得和主队列是一个级别的))
* - QOS_CLASS_USER_INITIATED // 用户期望 (不能放太耗时操作)
* - QOS_CLASS_DEFAULT // 默认(不是给程序员使用,用来重置队列)
* - QOS_CLASS_UTILITY // 实用工具(耗时操作可以放在这个线程中)
* - QOS_CLASS_BACKGROUND // 后台
*
* The global concurrent queues may still be identified by their priority,
* which map to the following QOS classes:
* 全局并发队列可能仍然通过 priority 进行表示。下面是 服务质量的映射:
* - 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
// 还有这一段
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 (搞优先级, 值为 2)
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 (默认优先级, 值为 0)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) (低优先级, 值为 -2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN (后台优先级,在高优先级执行完毕后值优先级的值 为 2)
在 swift 2.2 版本中 dispatch_sync(dispatch_get_global_queue(0, 0) // 基本可以看出这里为什么填 0 ,0 (第二个参数没有启用填任何数都可以,习惯填 0 )
文/潇小溅(简书作者)原文链接:http://www.jianshu.com/p/f042432e2d7d著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
3. 获取一个队列
我们使用 DispatchQueue.global()
获取一个系统的队列,这样的话获取的就是默认.default
优先级的队列了,如果要获取其他优先级的队列,就使用DispatchQueue.global(qos: .userInitiated)
,最后,我们使用 .async {}
来执行代码:
DispatchQueue.global(qos: .userInitiated).async {
//your code here
}
4. 创建一个队列
直接用 DispatchQueue
的初始化器来创建一个队列。最简单直接的办法是这样:
let queue = DispatchQueue(label: "myBackgroundQueue")
复杂一点?你可以指定优先级以及队列类别:
let queue = DispatchQueue(label: "myBackgroundQueue", qos: .userInitiated, attributes: .concurrent)
然后把代码放进去即可:
queue.async {
print("aaa")
}