当前位置:   article > 正文

swift之GCD基础_swift gcd

swift gcd

swift之GCD基础

1.主队列

//获取主队列
 	let mainQueue = DispatchQueue.main
  • 1
  • 2

2.串行队列

  • 创建时指定label 便于调试,一般使用bundle Identifier类似的命名方式
let queue = DispatchQueue(label: "com.syc.nd")
  • 1

3.并行队列

//获取全局并发队列
    let globleQueue = DispatchQueue.global()

//第二种
let queue = DispatchQueue(label: "com.xxx.xxx.queueName", attributes: .concurrent)
	
let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: DispatchQoS.default, attributes: [.concurrent, .initiallyInactive], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.never, target: DispatchQueue?.none)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.1创建队列方法参数解释

convenience init(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: DispatchQueue? = nil)
  • 1
  • label: 队列名称id

  • qos:(服务质量等级)队列的优先级,如果没有指定值,会使用默认的属性 unspecified (不指定优先级)

    • 优先级排列: userInteractive > userInitiated > default > utility > background > unspecified
    • 优先级: public static let userInteractive: DispatchQoS 用户交互 public static let userInitiated: DispatchQoS 用户发起 public static letdefault: DispatchQoS 默认优先级 public static let utility: DispatchQoS 对应oc中的low 低 public static let background: DispatchQoS 后台 public static let unspecified: DispatchQoS 不指定优先级
  • attributes: 选项集合 包含两个选项

    • concurrent: 表示队列为并行队列
    • initiallyInactive: 标识队列中的任务需要手动触发,由队列的activate方法来触发 如果未添加此标识,向队列中添加的任务会自动运行,如果不设置该值 表示创建的是串行队列, 如果希望创建的是并行队列,并且需要手动触发的话,需要添加值 [.concurrent, .initiallyInactive] 如果不需要的话 直接传[]
  • **autoreleaseFrequency:**类型为枚举类型 用来设置管理任务内对象生命周期的 autorelease pool 的自动释放频率 包含三个类型:

    • inherit: 集成目标队列的该属性
    • workItem: 跟随每个任务的执行周期进行自动创建和是释放
    • never: 不会自动创建 autorelease pool 需要自己手动管理
    • 一般采用workItem就可以了,如果任务中需要大量重复创建对象,可以使用never属性,来手动创建 autorelease pool
  • target: 这个参数设置了队列的目标队列,即队列中的任务运行时实际所在的队列。目标队列最终约束了队列的优先级等属性。
    在程序中手动创建的队列最后都指向了系统自带的主队类或全局并发队列

那为什么不直接将任务添加到系统队列中,而是自定义队列呢?这样的好处是可以将任务分组管理。如单独阻塞某个队列中的任务,而不是阻塞系统队列中的全部任务。如果阻塞了系统队列,所有指向它的原队列也就被阻塞。

4.同步任务(串行队列)

4.1串行队列中新增同步任务

  • 会阻塞当前线程,必须要等待当前任务执行完成之后,才能往下面执行,可以理解成这个同步任务把主线程阻塞了,让自己优先插队执行。
func simpleSQueue() -> Void {
        let queue = DispatchQueue(label: "com.syc.nd")
        //同步执行队列
        queue.sync {
            for i in 1...3 {
                print("同步执行队列---
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/691518
推荐阅读
相关标签