【发布时间】:2019-04-17 03:15:48
【问题描述】:
我已经阅读了很多示例代码,我知道通常您希望 更新您的 UI 的代码 在主线程上执行。如果我错过了什么,xcode 会在运行时抱怨。只是有时而已。
那么更新您的用户界面的代码实际上是如何定义的? 是否显示更新 UI 的警报?在 UITableView 上调用 reloadData()?简单地设置 UILabel 的文本怎么样? 特别是对于这三个,我一直在我的应用程序中以两种方式看到和使用它,并且无法真正找出规则。特别是因为 xcode 让我可以摆脱这两种情况......有时。
编辑:哦,我明白我的困惑来自哪里。我以为你在哪个线程上是随机的。但是你实际上“总是”在主线程上,除非你做一些类似任务的事情,它在后台线程上运行。
所以主线程检查器实际上并没有让我“逃脱”使用 reload() 和错误地更改我的 viewController 中的标签。只是保证我在主线程上。
我以为我不得不突然将每个标签更改都包含在 dispatch.async 中。
【问题讨论】:
-
如果屏幕上的某些内容发生了变化,它就是在更新 UI。几乎所有以
UI开头的课程都需要在主队列中。很少有例外。 -
用户界面或 UI 基本上是您在屏幕/视口上看到的任何东西。它可以是一个标签。它可以是表格视图。它可以是一个按钮。现在,如果与它们相关的任何值正在发生变化。例如。标签的文本,表格视图的内容,按钮的颜色,这称为更新 UI,Apple 建议在主线程上完成。如果不是,那么它会使您的应用程序看起来冻结,从而延迟本应立即执行的更改。这相当于糟糕的用户体验。
标签: ios swift multithreading user-interface grand-central-dispatch