Geo*_*eep 5 grand-central-dispatch ios swift
我最近发现了一些代码示例
func stpDispatchToMainThreadIfNecessary(_ block: @escaping () -> Void) {
if Thread.isMainThread {
block()
} else {
DispatchQueue.main.async(execute: block)
}
}
Run Code Online (Sandbox Code Playgroud)
看起来如果我们将所有块包装在 DispatchQueue.main.async 中,无论它是哪个线程,从技术上讲它都会起作用。
问题是为什么要检查主线程?
它增加了一些优化吗?如果是,在哪里可以阅读相关内容以及如何对其进行基准测试?
重要的是async派遣。
如果stpDispatchToMainThreadIfNecessary从主线程调用,block则同步执行,而如果从后台线程调用func,则由于调用async(execute:),block所以异步执行。
这意味着当从主线程调用时,由于同步执行,block将比也包装在 Dispatch 异步调用中执行得更快。
您可以更改async(execute:)to sync(execute:),在主线程的情况下,与简单调用相比不会导致任何延迟block(),但是,您不应该从后台线程同步分派到主线程,因为这可能会冻结 UI。
因此,检查 func 是否是从主线程调用的,在这种情况下是同步执行的block,同时从任何其他线程异步将其分派到主线程,确保从另一个线程调用 func 时不会不必要地阻塞主线程,但是从主线程调用 func 时也不会出现不必要的延迟。
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |