我们为什么要在主线程上执行所有与UI相关的任务?

时间:2016-07-25 03:06:50

标签: multithreading runloop

我们不能创建一个不同的线程并启动一个可以监听触摸事件或与UI相关的任何内容的runloop吗?是否有任何研究在多线程环境中处理UI任务?

1 个答案:

答案 0 :(得分:3)

UIKit不是内部线程安全的。

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

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

这并不是说UIKit内部没有并行性。软件和硬件都有。但是,承担为UI处理提供可重入API的高复杂性和性能费用没有重大价值。此外,UI是关于你可以拥有的最有状态的东西,可变状态是多线程代码的死敌。即使它很有价值,UI代码对于重入和线程安全也是特别具有挑战性的。正如您所注意到的,这在许多平台上或多或少都是正确的。