經(jīng)常容易混淆DispatchQueue.main與其它隊(duì)列的async執(zhí)行順序淹办,特做個(gè)記錄结胀,測(cè)試代碼如下:
for i in 0 ..< 10 {
DispatchQueue.main.async {
print("DispatchQueue.main.async 內(nèi)打印 i = \(i)")
}
DispatchQueue.global().sync {
print("DispatchQueue.global().sync 內(nèi)打印 i = \(i)")
}
DispatchQueue.global().async {
print("DispatchQueue.global().async 內(nèi)打印 i = \(i)")
}
print("DispatchQueue.main.async 外打印 i = \(i)")
}
DispatchQueue.main.async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.main.async.barrier 執(zhí)行 i")
}
DispatchQueue.global().async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.global().async.barrier 執(zhí)行 i")
}
for j in 0 ..< 10 {
DispatchQueue.main.async {
print("DispatchQueue.main.async 內(nèi)打印 j = \(j)")
}
DispatchQueue.global().sync {
print("DispatchQueue.global().sync 內(nèi)打印 j = \(j)")
}
DispatchQueue.global().async {
print("DispatchQueue.global().async 內(nèi)打印 j = \(j)")
}
print("DispatchQueue.main.async 外打印 j = \(j)")
}
DispatchQueue.main.async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.main.async.barrier 執(zhí)行 j")
}
DispatchQueue.global().async(group: nil, qos: .default, flags: [.barrier]) {
print("DispatchQueue.global().async.barrier 執(zhí)行 j")
}
執(zhí)行結(jié)果:
DispatchQueue.global().sync 內(nèi)打印 i = 0
DispatchQueue.main.async 外打印 i = 0
DispatchQueue.global().async 內(nèi)打印 i = 0
DispatchQueue.global().sync 內(nèi)打印 i = 1
DispatchQueue.main.async 外打印 i = 1
DispatchQueue.global().sync 內(nèi)打印 i = 2
DispatchQueue.global().async 內(nèi)打印 i = 1
DispatchQueue.global().async 內(nèi)打印 i = 2
DispatchQueue.main.async 外打印 i = 2
DispatchQueue.global().sync 內(nèi)打印 i = 3
DispatchQueue.main.async 外打印 i = 3
DispatchQueue.global().sync 內(nèi)打印 i = 4
DispatchQueue.global().async 內(nèi)打印 i = 3
DispatchQueue.main.async 外打印 i = 4
DispatchQueue.global().async 內(nèi)打印 i = 4
DispatchQueue.global().sync 內(nèi)打印 i = 5
DispatchQueue.main.async 外打印 i = 5
DispatchQueue.global().async 內(nèi)打印 i = 5
DispatchQueue.global().sync 內(nèi)打印 i = 6
DispatchQueue.main.async 外打印 i = 6
DispatchQueue.global().sync 內(nèi)打印 i = 7
DispatchQueue.main.async 外打印 i = 7
DispatchQueue.global().sync 內(nèi)打印 i = 8
DispatchQueue.main.async 外打印 i = 8
DispatchQueue.global().sync 內(nèi)打印 i = 9
DispatchQueue.main.async 外打印 i = 9
DispatchQueue.global().async 內(nèi)打印 i = 7
DispatchQueue.global().async 內(nèi)打印 i = 9
DispatchQueue.global().async 內(nèi)打印 i = 8
DispatchQueue.global().async 內(nèi)打印 i = 6
DispatchQueue.global().sync 內(nèi)打印 j = 0
DispatchQueue.global().async.barrier 執(zhí)行 i
DispatchQueue.main.async 外打印 j = 0
DispatchQueue.global().async 內(nèi)打印 j = 0
DispatchQueue.global().sync 內(nèi)打印 j = 1
DispatchQueue.main.async 外打印 j = 1
DispatchQueue.global().async 內(nèi)打印 j = 1
DispatchQueue.global().sync 內(nèi)打印 j = 2
DispatchQueue.main.async 外打印 j = 2
DispatchQueue.global().async 內(nèi)打印 j = 2
DispatchQueue.global().sync 內(nèi)打印 j = 3
DispatchQueue.main.async 外打印 j = 3
DispatchQueue.global().async 內(nèi)打印 j = 3
DispatchQueue.global().sync 內(nèi)打印 j = 4
DispatchQueue.main.async 外打印 j = 4
DispatchQueue.global().sync 內(nèi)打印 j = 5
DispatchQueue.global().async 內(nèi)打印 j = 4
DispatchQueue.global().async 內(nèi)打印 j = 5
DispatchQueue.main.async 外打印 j = 5
DispatchQueue.global().sync 內(nèi)打印 j = 6
DispatchQueue.main.async 外打印 j = 6
DispatchQueue.global().async 內(nèi)打印 j = 6
DispatchQueue.global().sync 內(nèi)打印 j = 7
DispatchQueue.main.async 外打印 j = 7
DispatchQueue.global().sync 內(nèi)打印 j = 8
DispatchQueue.global().async 內(nèi)打印 j = 7
DispatchQueue.main.async 外打印 j = 8
DispatchQueue.global().async 內(nèi)打印 j = 8
DispatchQueue.global().sync 內(nèi)打印 j = 9
DispatchQueue.main.async 外打印 j = 9
DispatchQueue.global().async 內(nèi)打印 j = 9
DispatchQueue.global().async.barrier 執(zhí)行 j
DispatchQueue.main.async 內(nèi)打印 i = 0
DispatchQueue.main.async 內(nèi)打印 i = 1
DispatchQueue.main.async 內(nèi)打印 i = 2
DispatchQueue.main.async 內(nèi)打印 i = 3
DispatchQueue.main.async 內(nèi)打印 i = 4
DispatchQueue.main.async 內(nèi)打印 i = 5
DispatchQueue.main.async 內(nèi)打印 i = 6
DispatchQueue.main.async 內(nèi)打印 i = 7
DispatchQueue.main.async 內(nèi)打印 i = 8
DispatchQueue.main.async 內(nèi)打印 i = 9
DispatchQueue.main.async.barrier 執(zhí)行 i
DispatchQueue.main.async 內(nèi)打印 j = 0
DispatchQueue.main.async 內(nèi)打印 j = 1
DispatchQueue.main.async 內(nèi)打印 j = 2
DispatchQueue.main.async 內(nèi)打印 j = 3
DispatchQueue.main.async 內(nèi)打印 j = 4
DispatchQueue.main.async 內(nèi)打印 j = 5
DispatchQueue.main.async 內(nèi)打印 j = 6
DispatchQueue.main.async 內(nèi)打印 j = 7
DispatchQueue.main.async 內(nèi)打印 j = 8
DispatchQueue.main.async 內(nèi)打印 j = 9
DispatchQueue.main.async.barrier 執(zhí)行 j
可得到如下結(jié)論:
1怎栽、DispatchQueue.main.async block中的代碼颊亮,相對(duì)于調(diào)用DispatchQueue.main.async的代碼剔宪,是延后執(zhí)行的(因?yàn)槭莂sync)拂铡,多次添加到DispatchQueue.main.async中的代碼塊,也是按順序執(zhí)行的(因?yàn)槭侵麝?duì)列)
2葱绒、DispatchQueue.main.sync會(huì)崩潰感帅,因?yàn)閙ain是主隊(duì)列,必須按順序執(zhí)行地淀,當(dāng)前添加DispatchQueue.main.sync的代碼都沒有執(zhí)行完失球,然后去等添加的block執(zhí)行,所以會(huì)崩潰
3帮毁、調(diào)用DispatchQueue.global().sync的線程會(huì)等待sync中的block執(zhí)行完成后執(zhí)行
4实苞、DispatchQueue.global().async是異步執(zhí)行的,執(zhí)行順序也不定
5烈疚、DispatchQueue.global().async.barrier會(huì)等當(dāng)前隊(duì)列內(nèi)部所有任務(wù)執(zhí)行完成后再執(zhí)行