
GCD简介
GCD提供并管理了FIFO任务队列,提交到任务队列中的任务(Task)在一个线程池中执行。
同步sync, 异步async
let queue = DispatchQueue(label: "com.flion.myqueue")
queue.sync {
for i in 0..<10 {
print("⚽️ \(i)")
}
}
for i in 100..<110 {
print("🏀 \(i)")
}
let queue = DispatchQueue(label: "com.flion.myqueue")
queue.async {
for i in 0..<10 {
print("⚽️ \(i)")
}
}
for i in 100..<110 {
print("🏀 \(i)")
}
GCD优先级Quality Of Service
创建任务队列时可以指定QoS优先级,优先级从高到低如下所示,
- userInteractive
- userInitiated
- default
- utility
- background
- unspecified
let queue1 = DispatchQueue(label: "com.flion.queue1", qos: DispatchQoS.background)
let queue2 = DispatchQueue(label: "com.flion.queue2", qos: DispatchQoS.utility)
queue1.async {
for i in 0..<10 {
print("红色 \(i)")
}
}
queue2.async {
for i in 100..<110 {
print("蓝色 \(i)")
}
}
高优先级的队列中的任务会被优先执行,读者可以尝试指定不同的优先级,看一看效果。
串行serial,并行concurrent
串行队列中,同一时间只能执行一个任务,也就是说当前一个
任务执行结束的时候,才开始执行后一个
任务。
在并行队列中,队列中的任务依次出队列(dequeue serially),这些任务在同一时间一起执行,且这些任务可以以多种顺序结束,所以不能保证某一个任务最先执行完毕。
// 默认串行队列
let anotherQueue = DispatchQueue(label: "com.flion.anotherQueue", qos: .utility)
anotherQueue.async {
for i in 0..<10 {
print("白色 \(i)")
}
}
anotherQueue.async {
for i in 100..<110 {
print("黑色 \(i)")
}
}
anotherQueue.async {
for i in 1000..<1010 {
print("黑白色 \(i)")
}
}
// 创建并行队列
let anotherQueue = DispatchQueue(label: "com.flion.anotherQueue", qos: .utility, attributes: .concurrent)
anotherQueue.async {
for i in 0..<10 {
print("白色 \(i)")
}
}
anotherQueue.async {
for i in 100..<110 {
print("黑色 \(i)")
}
}
anotherQueue.async {
for i in 1000..<1010 {
print("黑白色 \(i)")
}
}
在iOS开发中,主线程队列时串行队列,global队列时并行队列,如下所示,
let main = DispatchQueue.main
let global = DispatchQueue.global()
let global2 = DispatchQueue.global(qos: .userInitiated)
延迟执行
let delayQueue = DispatchQueue(label: "com.flion.delayqueue", qos: .userInitiated)
let delayTime = DispatchTimeInterval.seconds(2)
print(Date())
delayQueue.asyncAfter(deadline: .now() + delayTime) {
print(Date())
}
网友评论