global().async 中的 main.sync 是什么意思?
What does main.sync in global().async mean?
在Swift中,我有时会用到这种模式。
DispatchQueue.global().async {
// do stuff in background, concurrent thread
DispatchQueue.main.sync {
// update UI
}
}
这个模式的目的很明确。在全局线程中进行耗时计算,使 UI 不被锁定,并在计算完成后在主线程中更新 UI。
没有什么可计算的怎么办?我刚刚在我的项目中发现了一个逻辑
//A
DispatchQueue.main.sync {
// do something
}
崩溃但是
// B
DispatchQueue.global().async {
DispatchQueue.main.sync {
// do something
}
}
不会崩溃。
它们有什么不同?案例 B 与此不同吗?
// C
DispatchQueue.main.async {
// do something
}
还有一个问题。我知道主线程是串行队列,但是如果我 运行 多个代码块在多个 main.async
中,它就像并发队列一样工作。
DispatchQueue.main.async {
// do A
}
DispatchQueue.main.async {
// do B
}
如果主线程真的是一个串行队列,它们怎么能同时运行?如果它只是一个时间片,那么它们与全局并发队列有何不同而不是主线程可以更新 UI?
x.sync
表示调用队列会暂停,等待同步块结束再继续。所以在你的例子中:
DispatchQueue.global().async {
// yada yada something
DispatchQueue.main.sync {
// update UI
}
// this will happen only after 'update UI' has finished executing
}
通常您不需要 sync
返回到 main,async 可能足够好并且更安全,可以避免死锁。除非是特殊情况,你需要等到 main 上的某些东西完成后再继续你的异步任务。
至于一个崩溃的例子——调用同步并以当前队列为目标是一个死锁(调用队列等待同步块完成,但它不会启动,因为目标队列(相同)正忙于等待 sync
调用完成),这可能就是崩溃的原因。
至于使用异步在主队列上调度多个块:它们不会 运行 并行 - 它们会一个接一个地发生。
也不要假设队列 == 线程。将多个块调度到同一个队列中,可能会创建系统允许的尽可能多的线程。只是主队列比较特殊,它利用了主线程。
在Swift中,我有时会用到这种模式。
DispatchQueue.global().async {
// do stuff in background, concurrent thread
DispatchQueue.main.sync {
// update UI
}
}
这个模式的目的很明确。在全局线程中进行耗时计算,使 UI 不被锁定,并在计算完成后在主线程中更新 UI。
没有什么可计算的怎么办?我刚刚在我的项目中发现了一个逻辑
//A
DispatchQueue.main.sync {
// do something
}
崩溃但是
// B
DispatchQueue.global().async {
DispatchQueue.main.sync {
// do something
}
}
不会崩溃。
它们有什么不同?案例 B 与此不同吗?
// C
DispatchQueue.main.async {
// do something
}
还有一个问题。我知道主线程是串行队列,但是如果我 运行 多个代码块在多个 main.async
中,它就像并发队列一样工作。
DispatchQueue.main.async {
// do A
}
DispatchQueue.main.async {
// do B
}
如果主线程真的是一个串行队列,它们怎么能同时运行?如果它只是一个时间片,那么它们与全局并发队列有何不同而不是主线程可以更新 UI?
x.sync
表示调用队列会暂停,等待同步块结束再继续。所以在你的例子中:
DispatchQueue.global().async {
// yada yada something
DispatchQueue.main.sync {
// update UI
}
// this will happen only after 'update UI' has finished executing
}
通常您不需要 sync
返回到 main,async 可能足够好并且更安全,可以避免死锁。除非是特殊情况,你需要等到 main 上的某些东西完成后再继续你的异步任务。
至于一个崩溃的例子——调用同步并以当前队列为目标是一个死锁(调用队列等待同步块完成,但它不会启动,因为目标队列(相同)正忙于等待 sync
调用完成),这可能就是崩溃的原因。
至于使用异步在主队列上调度多个块:它们不会 运行 并行 - 它们会一个接一个地发生。 也不要假设队列 == 线程。将多个块调度到同一个队列中,可能会创建系统允许的尽可能多的线程。只是主队列比较特殊,它利用了主线程。