gpt4 book ai didi

ios - 在 iOS GCD 中调用 DispatchQueue.main.async 的成本

转载 作者:行者123 更新时间:2023-12-04 03:24:45 27 4
gpt4 key购买 nike

我最近发现了一些代码示例

func stpDispatchToMainThreadIfNecessary(_ block: @escaping () -> Void) {
if Thread.isMainThread {
block()
} else {
DispatchQueue.main.async(execute: block)
}
}
看起来如果我们将所有 block 包装在 DispatchQueue.main.async 中,无论它是哪个线程,它在技术上都可以工作。
问题是为什么要检查主线程?
它是否增加了一些优化?如果是 - 在哪里阅读它以及如何对其进行基准测试?

最佳答案

重要的一点是 async dispatch 。
如果 stpDispatchToMainThreadIfNecessary从主线程调用,block同步执行,而如果从后台线程调用 func,由于 async(execute:)调用,block是异步执行的。
这意味着当从主线程调用时,由于同步执行,block将比它也包装在 Dispatch 异步调用中更快地执行。
您可以更改 async(execute:)sync(execute:) ,与简单地调用 block() 相比,在主线程的情况下不会导致延迟但是,您不应该从后台线程同步调度到主线程,因为这可能会卡住 UI。
因此检查是否从主线程调用 func 并在这种情况下同步执行 block ,而从任何其他线程将其异步分派(dispatch)到主线程可确保在从另一个线程调用 func 时不会不必要地阻塞主线程,而且在从主线程调用 func 时也不会出现不必要的延迟。

关于ios - 在 iOS GCD 中调用 DispatchQueue.main.async 的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67791152/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com