开头
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)")
}
}
调度组
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")
}
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
let workItme = DispatchWorkItem {
Thread.sleep(forTimeInterval: 5)
print("workItme ----- \(Thread.current)")
}
concurrent.async(execute: workItme)
DispatchQueue参数详解
DispatchQueue(label: String,
qos: DispatchQoS,
attributes: DispatchQueue.Attributes,
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency,
target: DispatchQueue?)
let queue = DispatchQueue(label: "concurrent", attributes: [.concurrent, .initiallyInactive])
queue.async {
print(Thread.current)
}
queue.activate()