零基础iOS开发学习日记-功能篇-多线程-Swift

开头

Swift版的GCD

  • 因为GCD在Swift中还是变化挺多的,就另外整理一下

并发队列

  • 异步执行
let concurrent = DispatchQueue(label: "concurrent", attributes:.concurrent)
for i in 0..<10 {
    concurrent.async {
        print("\(i) ------ \(Thread.current)")
    }
}
复制代码
  • 同步执行
let concurrent = DispatchQueue(label: "concurrent")
for i in 0..<10 {
    concurrent.sync {
        print("\(i) ------ \(Thread.current)")
    }
}
复制代码
  • 简化,第二个参数设置了是并发队列,不设置默认是串行队列
DispatchQueue(label: "concurrent", attributes: .concurrent).async {
    print("\(i) ------ \(Thread.current)")
}
复制代码

串行队列

  • 异步执行
let serial = DispatchQueue(label: "serial")
for i in 0..<10 {
    serial.async {
        print("\(i) ------ \(Thread.current)")
    }
    
}
复制代码
  • 同步执行
let serial = DispatchQueue(label: "serial")
for i in 0..<10 {
    serial.sync {
        print("\(i) ------ \(Thread.current)")
    }
    
}
复制代码

主队列与全局队列

  • 主队列
for i in 0..<10 {
    DispatchQueue.main.async {
        print("\(i) ------ \(Thread.current)")
    }
}
复制代码
  • 全局队列
let global = DispatchQueue.global()
for i in 0..<10 {
    global.async {
        print("\(i) ------ \(Thread.current)")
    }
    
}

let global = DispatchQueue.global()
for i in 0..<10 {
    global.sync {
        print("\(i) ------ \(Thread.current)")
    }
    
}
复制代码

调度组

  • notify
let group = DispatchGroup()
let concurrent = DispatchQueue(label: "concurrent", attributes: .concurrent)
concurrent.async(group: group) {
    Thread.sleep(forTimeInterval: 5)
    print("1-----\(Thread.current)")
}
concurrent.async(group: group) {
        Thread.sleep(forTimeInterval: 5)
        print("2-----\(Thread.current)")
    }
group.notify(queue: DispatchQueue.main) {
    print("finish --- \(Thread.current)")
    print("group end")
}
复制代码
  • wait
group.wait()
print("group end")
复制代码
  • 原理
let group = DispatchGroup()
let concurrent = DispatchQueue(label: "concurrent", attributes: .concurrent)

group.enter()
concurrent.async {
    Thread.sleep(forTimeInterval: 5)
    print("1-----\(Thread.current)")
    group.leave()
}
group.enter()
concurrent.async {
    Thread.sleep(forTimeInterval: 5)
    print("2-----\(Thread.current)")
    group.leave()
}

group.wait()
print("group end")
复制代码

DispatchWorkItem

  • DispatchWorkItem一段预执行的代码
let workItme = DispatchWorkItem {
    Thread.sleep(forTimeInterval: 5)
    print("workItme ----- \(Thread.current)")
    
}
concurrent.async(execute: workItme)
复制代码

DispatchQueue参数详解

DispatchQueue(label: String,  //队列名
qos: DispatchQoS,  //服务优先级
attributes: DispatchQueue.Attributes, //队列类型,不设置时为串行队列;concurrent为并发队列;initiallyInactive需要队列的activate手动触发 
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency, //自动释放频率,inherit继承目标队列;workItem自动释放池;never不会创建自动释放池
target: DispatchQueue?) //设置了队列的目标队列
复制代码
  • initiallyInactive
let queue = DispatchQueue(label: "concurrent", attributes: [.concurrent, .initiallyInactive])
queue.async {
    print(Thread.current)
}
queue.activate()
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享