经常容易混淆DispatchQueue.main与其它队列的async执行顺序,特做个记录,测试代码如下:
for i in 0 ..< 10 {
DispatchQueue.main.async {
print("DispatchQueue.main.async 内打印 i = \(i)")
}
DispatchQueue.global().sync {
print("DispatchQueue.global().sync 内打印 i = \(i)")
}
DispatchQueue.global().async {
print("DispatchQueue.global().async 内打印 i = \(i)")
}
print("DispatchQueue.main.async 外打印 i = \(i)")
}
DispatchQueue.main.async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.main.async.barrier 执行 i")
}
DispatchQueue.global().async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.global().async.barrier 执行 i")
}
for j in 0 ..< 10 {
DispatchQueue.main.async {
print("DispatchQueue.main.async 内打印 j = \(j)")
}
DispatchQueue.global().sync {
print("DispatchQueue.global().sync 内打印 j = \(j)")
}
DispatchQueue.global().async {
print("DispatchQueue.global().async 内打印 j = \(j)")
}
print("DispatchQueue.main.async 外打印 j = \(j)")
}
DispatchQueue.main.async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.main.async.barrier 执行 j")
}
DispatchQueue.global().async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.global().async.barrier 执行 j")
}
执行结果:
DispatchQueue.global().sync 内打印 i = 0
DispatchQueue.main.async 外打印 i = 0
DispatchQueue.global().async 内打印 i = 0
DispatchQueue.global().sync 内打印 i = 1
DispatchQueue.main.async 外打印 i = 1
DispatchQueue.global().sync 内打印 i = 2
DispatchQueue.global().async 内打印 i = 1
DispatchQueue.global().async 内打印 i = 2
DispatchQueue.main.async 外打印 i = 2
DispatchQueue.global().sync 内打印 i = 3
DispatchQueue.main.async 外打印 i = 3
DispatchQueue.global().sync 内打印 i = 4
DispatchQueue.global().async 内打印 i = 3
DispatchQueue.main.async 外打印 i = 4
DispatchQueue.global().async 内打印 i = 4
DispatchQueue.global().sync 内打印 i = 5
DispatchQueue.main.async 外打印 i = 5
DispatchQueue.global().async 内打印 i = 5
DispatchQueue.global().sync 内打印 i = 6
DispatchQueue.main.async 外打印 i = 6
DispatchQueue.global().sync 内打印 i = 7
DispatchQueue.main.async 外打印 i = 7
DispatchQueue.global().sync 内打印 i = 8
DispatchQueue.main.async 外打印 i = 8
DispatchQueue.global().sync 内打印 i = 9
DispatchQueue.main.async 外打印 i = 9
DispatchQueue.global().async 内打印 i = 7
DispatchQueue.global().async 内打印 i = 9
DispatchQueue.global().async 内打印 i = 8
DispatchQueue.global().async 内打印 i = 6
DispatchQueue.global().sync 内打印 j = 0
DispatchQueue.global().async.barrier 执行 i
DispatchQueue.main.async 外打印 j = 0
DispatchQueue.global().async 内打印 j = 0
DispatchQueue.global().sync 内打印 j = 1
DispatchQueue.main.async 外打印 j = 1
DispatchQueue.global().async 内打印 j = 1
DispatchQueue.global().sync 内打印 j = 2
DispatchQueue.main.async 外打印 j = 2
DispatchQueue.global().async 内打印 j = 2
DispatchQueue.global().sync 内打印 j = 3
DispatchQueue.main.async 外打印 j = 3
DispatchQueue.global().async 内打印 j = 3
DispatchQueue.global().sync 内打印 j = 4
DispatchQueue.main.async 外打印 j = 4
DispatchQueue.global().sync 内打印 j = 5
DispatchQueue.global().async 内打印 j = 4
DispatchQueue.global().async 内打印 j = 5
DispatchQueue.main.async 外打印 j = 5
DispatchQueue.global().sync 内打印 j = 6
DispatchQueue.main.async 外打印 j = 6
DispatchQueue.global().async 内打印 j = 6
DispatchQueue.global().sync 内打印 j = 7
DispatchQueue.main.async 外打印 j = 7
DispatchQueue.global().sync 内打印 j = 8
DispatchQueue.global().async 内打印 j = 7
DispatchQueue.main.async 外打印 j = 8
DispatchQueue.global().async 内打印 j = 8
DispatchQueue.global().sync 内打印 j = 9
DispatchQueue.main.async 外打印 j = 9
DispatchQueue.global().async 内打印 j = 9
DispatchQueue.global().async.barrier 执行 j
DispatchQueue.main.async 内打印 i = 0
DispatchQueue.main.async 内打印 i = 1
DispatchQueue.main.async 内打印 i = 2
DispatchQueue.main.async 内打印 i = 3
DispatchQueue.main.async 内打印 i = 4
DispatchQueue.main.async 内打印 i = 5
DispatchQueue.main.async 内打印 i = 6
DispatchQueue.main.async 内打印 i = 7
DispatchQueue.main.async 内打印 i = 8
DispatchQueue.main.async 内打印 i = 9
DispatchQueue.main.async.barrier 执行 i
DispatchQueue.main.async 内打印 j = 0
DispatchQueue.main.async 内打印 j = 1
DispatchQueue.main.async 内打印 j = 2
DispatchQueue.main.async 内打印 j = 3
DispatchQueue.main.async 内打印 j = 4
DispatchQueue.main.async 内打印 j = 5
DispatchQueue.main.async 内打印 j = 6
DispatchQueue.main.async 内打印 j = 7
DispatchQueue.main.async 内打印 j = 8
DispatchQueue.main.async 内打印 j = 9
DispatchQueue.main.async.barrier 执行 j
可得到如下结论:
1、DispatchQueue.main.async block中的代码,相对于调用DispatchQueue.main.async的代码,是延后执行的(因为是async),多次添加到DispatchQueue.main.async中的代码块,也是按顺序执行的(因为是主队列)
2、DispatchQueue.main.sync会崩溃,因为main是主队列,必须按顺序执行,当前添加DispatchQueue.main.sync的代码都没有执行完,然后去等添加的block执行,所以会崩溃
3、调用DispatchQueue.global().sync的线程会等待sync中的block执行完成后执行
4、DispatchQueue.global().async是异步执行的,执行顺序也不定
5、DispatchQueue.global().async.barrier会等当前队列内部所有任务执行完成后再执行
网友评论