在 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 调用,waitsleep,一些同步 API 等) . 我建议在getRequest 之前、DispatchQueue.main.async 之前和async 调用中添加调试语句。测量每一个的时间。确定每个之间经过了多少时间。当您知道观察到延迟的位置后,您就可以开始研究它了。 【参考方案1】:

如果不经常调用APIData().getRequest,则可以忽略交易。由于这是与网络相关的,我认为情况并非如此,实际上没有开销。

还请记住,如果您有一些性能问题,您应该使用 Xcode 工具来定位问题的根源,而不是询问正在发生的性能问题是什么。人们通常会责怪代码的某些部分不负责性能问题(空间新手),他们浪费时间来优化可以正常工作的东西。

您的代码复杂性在时间上是恒定的,所以如果您有性能问题,这不是问题。

offtopic:这段代码看起来很糟糕,很难阅读和维护。考虑使其更简单,将其拆分为多行。 事实上,这看起来很糟糕,因为网络层靠近 UI 部分。您没有应该维护数据结构和业务逻辑的数据模型。

【讨论】:

它是多行的,但是当我把它放在这里时,它变成了一个。 @Marek 另外,我确实有一个数据模型,我在其中解析 JSON 并存储在一个数组中。

以上是关于在 DispatchQueue.main.async 上运行代码是不是更慢?的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据