美文网首页
swift3.0 -- GCD

swift3.0 -- GCD

作者: MRNAN_ | 来源:发表于2016-10-17 15:43 被阅读38次

    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")
    }
    

    相关文章

      网友评论

          本文标题:swift3.0 -- GCD

          本文链接:https://www.haomeiwen.com/subject/ggtzyttx.html