swift3.0 -- GCD

2016-10-17  本文已影响38人  MRNAN_

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")
}
上一篇下一篇

猜你喜欢

热点阅读