DispatchQueue主隊(duì)列與其它隊(duì)列的async與sync

經(jīng)常容易混淆DispatchQueue.main與其它隊(duì)列的async執(zhí)行順序,特做個(gè)記錄,測試代碼如下:

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í)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容