开头
- 这是分篇章,整篇请看零基础iOS开发学习日记
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