for循环内执行异步操作
for i in 0...10 {
DispatchQueue.global().async {
print("异步执行:\(i)")
}
}
控制台打印如下,完全无序:
异步执行:3
异步执行:0
异步执行:2
异步执行:1
异步执行:5
异步执行:4
异步执行:10
异步执行:7
异步执行:8
异步执行:9
异步执行:6
增加信号量控制
let semaphore = DispatchSemaphore(value: 1) // 信号量1
for i in 0...10 {
semaphore.wait() // 信号量 -1
DispatchQueue.global().async {
print("异步执行:\(i)")
semaphore.signal() // 信号量 +1
}
}
此时控制台打印如下,异步操作有序执行:
异步执行:0
异步执行:1
异步执行:2
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:9
异步执行:10
再看下面的代码:
for i in 0...10 {
DispatchQueue.global().async {
print("异步执行:\(i)")
}
}
print("异步执行完成")
控制台打印如下,异步操作无序执行,且for循环外的代码先执行了:
异步执行完成
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:0
异步执行:2
异步执行:9
异步执行:10
异步执行:1
按照前面提到的增加信号量控制
let semaphore = DispatchSemaphore(value: 1) // 信号量1
for i in 0...10 {
semaphore.wait() // 信号量 -1
DispatchQueue.global().async {
print("异步执行:\(i)")
semaphore.signal() // 信号量 +1
}
}
print("异步执行完成")
此时的控制台打印如下:
异步执行:0
异步执行:1
异步执行:2
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:9
异步执行完成
异步执行:10
细心观察会发现,异步操作全部有序执行。但是for循环外的代码会在最后一次信号量之前执行。
我们在此基础上再做些改动,将for循环外的代码也用信号量控制起来:
let semaphore = DispatchSemaphore(value: 1) // 信号量1
for i in 0...10 {
semaphore.wait() // 信号量 -1
DispatchQueue.global().async {
print("异步执行:\(i)")
semaphore.signal() // 信号量 +1
}
}
semaphore.wait() // 信号量 -1
print("异步执行完成")
semaphore.signal() // 信号量 +1
此时的控制台打印如下:
异步执行:0
异步执行:1
异步执行:2
异步执行:3
异步执行:4
异步执行:5
异步执行:6
异步执行:7
异步执行:8
异步执行:9
异步执行:10
异步执行完成
到这里,聪明的你一定发现哪里不同
网友评论