【问题标题】:Why should we do all the UI related tasks on main thread?为什么我们要在主线程上完成所有与 UI 相关的任务?
【发布时间】:2016-07-25 03:06:50
【问题描述】:

我们不能创建一个不同的线程并启动一个运行循环来监听触摸事件或与 UI 相关的任何事情吗?是否正在进行任何研究来处理多线程环境中的 UI 任务?

【问题讨论】:

标签: multithreading runloop


【解决方案1】:

UIKit 不是内部线程安全的。

我觉得我应该进一步解释,但这确实是全部答案。在苹果之外没有这方面的研究,因为只有苹果在维护 UIKit。他们不太可能大规模重写 UIKit 以使其成为线程安全的,更不用说他们这样做会带来显着的性能损失。除非文档中另有明确说明,否则您必须在主线程上完成所有 UI 事件和主上下文绘制工作。

也许值得更进一步:多线程 UI 的价值非常有限。每个像素一次只能显示一件事。电容式触摸传感器一次只能发送一个信号。只有一个用户界面。 concurrency and/or parallelism 的承诺是我可以更好地同时推理问题,或者我可以更好地利用并行硬件。我不能实际上同时画两个东西。只有一个屏幕。最终我在画一件事。一堆曲线,归根结底,仍然是一张“图片”。它被合成并绘制为一个单一的东西。这与计算工作相反。我可以实际上同时计算两条贝塞尔曲线,完全并行,并更多地利用硬件。这是我今天可以在其他线程上做的事情。

这并不是说 UIKit 内部没有并行性。软件和硬件都有。但是,承担为 UI 处理提供可重入 API 的高复杂性和性能开销并没有什么重大价值。此外,UI 是您可以拥有的最有状态的东西,而可变状态是多线程代码的死敌。即使它很有价值,但 UI 代码要使可重入和线程安全尤其具有挑战性。正如您所指出的,这在许多平台上或多或少都是正确的。

【讨论】:

  • 但我觉得在其他技术中,无论是新的还是旧的,都没有对UI任务的多线程支持。是很难实现还是根本不可能?
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多