美文网首页
DispatchQueue主队列与其它队列的async与sync

DispatchQueue主队列与其它队列的async与sync

作者: sierwan | 来源:发表于2023-04-27 14:15 被阅读0次

经常容易混淆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会等当前队列内部所有任务执行完成后再执行

相关文章

网友评论

      本文标题:DispatchQueue主队列与其它队列的async与sync

      本文链接:https://www.haomeiwen.com/subject/lygbjdtx.html