在 DispatchQueue.main.async 上运行代码是不是更慢?
Posted
技术标签:
【中文标题】在 DispatchQueue.main.async 上运行代码是不是更慢?【英文标题】:Is running code on DispatchQueue.main.async slower?在 DispatchQueue.main.async 上运行代码是否更慢? 【发布时间】:2018-04-12 01:40:59 【问题描述】:在创建一个标签时,该标签在从该 API 返回数据的闭包中使用来自该 API 的数据:
APIData().getRequest(epicGamesUsername: "test") (output) in
DispatchQueue.main.async
let winsLabelForProfile = Label().createLabel(labelText: output[0], font: "Avenir-HeavyOblique", fontSize: 45, center: center, centerX: centerX, centerY: centerY, offsetX: 0, offsetY: -(self.view.frame.width / 13), height: self.view.frame.width / 6, width: self.view.frame.width / 2, textAlignment: NSTextAlignment.center)
self.view.addSubview(winsLabelForProfile)
我必须将标签的创建放回主线程。
我的问题很简单:以这种方式添加标签会降低我的应用程序的速度吗?如果是这样,有什么更好的方法来做到这一点?
当我测试添加标签而不是异步添加标签时,它肯定看起来更快。
【问题讨论】:
这个闭包是否已经在主线程上运行?检查Thread.isMainThread
。许多 API 已经将它们的完成处理程序分派到主线程,所以如果这里是这种情况,再次异步分派到主线程只会不必要地减慢它。但是,如果这个完成处理程序没有在主线程上运行,那么你别无选择,你必须将它分派回主线程。
@Rob 似乎它没有在主线程上运行。该死,它现在似乎只是特别慢。
很遗憾,没有reproducible example of the problem,我们只是在猜测。但一般来说,如果 UI 很慢,要么是因为你从后台线程为 UI 做了一些事情,要么你有一些东西阻塞了主线程(sync
调用,wait
或 sleep
,一些同步 API 等) .
我建议在getRequest
之前、DispatchQueue.main.async
之前和async
调用中添加调试语句。测量每一个的时间。确定每个之间经过了多少时间。当您知道观察到延迟的位置后,您就可以开始研究它了。
【参考方案1】:
如果不经常调用APIData().getRequest
,则可以忽略交易。由于这是与网络相关的,我认为情况并非如此,实际上没有开销。
还请记住,如果您有一些性能问题,您应该使用 Xcode 工具来定位问题的根源,而不是询问正在发生的性能问题是什么。人们通常会责怪代码的某些部分不负责性能问题(空间新手),他们浪费时间来优化可以正常工作的东西。
您的代码复杂性在时间上是恒定的,所以如果您有性能问题,这不是问题。
offtopic:这段代码看起来很糟糕,很难阅读和维护。考虑使其更简单,将其拆分为多行。 事实上,这看起来很糟糕,因为网络层靠近 UI 部分。您没有应该维护数据结构和业务逻辑的数据模型。
【讨论】:
它是多行的,但是当我把它放在这里时,它变成了一个。 @Marek 另外,我确实有一个数据模型,我在其中解析 JSON 并存储在一个数组中。以上是关于在 DispatchQueue.main.async 上运行代码是不是更慢?的主要内容,如果未能解决你的问题,请参考以下文章
在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?