在Swift中,我有时会使用这种模式.
DispatchQueue.global().async {
// do stuff in background, concurrent thread
DispatchQueue.main.sync {
// update UI
}
}
Run Code Online (Sandbox Code Playgroud)
这种模式的目的很明确.在全局线程中进行耗时的计算,因此UI未被锁定,并且在计算完成后更新主线程中的UI.
如果没有什么可计算的怎么办?我刚刚在我的项目中发现了一个逻辑
//A
DispatchQueue.main.sync {
// do something
}
Run Code Online (Sandbox Code Playgroud)
崩溃但是
// B
DispatchQueue.global().async {
DispatchQueue.main.sync {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
没有崩溃.
他们有什么不同?案例B是否与此不同?
// C
DispatchQueue.main.async {
// do something
}
Run Code Online (Sandbox Code Playgroud)
还有一个问题.我知道主线程是串行队列,但如果我多个运行多个代码块main.async,它就像并发队列一样.
DispatchQueue.main.async {
// do A
}
DispatchQueue.main.async {
// do B
}
Run Code Online (Sandbox Code Playgroud)
如果主线程实际上是一个串行队列,它们如何同时运行?如果它只是一个时间切片而不是它们与全局并发队列的不同而不是主线程可以更新UI?