如果我们在后台队列上调用main.async什么时候执行代码?

时间:2018-02-23 11:23:09

标签: ios swift multithreading grand-central-dispatch

在后台线程上调用main.async以运行应由主线程处理的UI代码似乎是一种标准做法。

当我们在后台线程上调用main.async并且主线程忙于使用未使用任何GCD调用的普通代码时(我假设这相当于main.sync?)这个代码执行的时间是什么时候?

是先执行常规main.sync代码还是执行main.async代码,这是如何工作的?单个队列如何同时执行异步和同步代码?

游乐场示例:(打印A数组但不打印B数组)

let a = "a"
let b = "b"
let aArray = [a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a]
let bArray = [b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b]

for letter in aArray {
    print(letter)
}
DispatchQueue.global().async {
    print("Entered background thread")
    DispatchQueue.main.async {
        print("Left background thread")
        for letter in bArray {
            print(letter)
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在代码执行时,使用syncasync对主代码进行排队没有区别 - 在这两种情况下,代码一旦成为第一个代码就会被执行一个在主线程的队列中。应该在主线程上发生一系列任务。你在那个队列上添加了一些东西如果在代码执行之前排队的所有内容都会被执行,那么无论您是使用sync还是async添加代码,代码都会轮流使用。

唯一的区别在于调用线程发生了什么 - 使用sync后台线程被阻塞,直到主线程上的代码被执行;使用async后台线程将继续。

这里只是一个旁注 - 永远不要在主线程上调用DispatchQueue.main.sync - 它会导致死锁。