什么需要在主线程?

我写了一个名为ensureInMainThread的小定义(我用了很多)。 但是,我不确定在主线程上需要调用哪些用户界面方法。 那么setNeedsDisplaysetNeedsLayout怎么样? 需要在iOS 5.x中的主线程上调用的方法的经验法则是什么?

这些问题是相关的(一些低质量的问题和答案,以及一些非常具体的案例),但我想要一个全面,单一的好答案:

  • UIView setNeedsDisplay不在主线程上?
  • UIView的-drawRect:是否必须在主线程上调用?
  • 从UIView制作UIImage,但不在主线程中

从iOS 4.0开始, 可以在后台线程上执行一些用户界面更新 :

  • 在UIKit中绘制图形上下文现在是线程安全的。 特别:

    • 用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文。

    • 字符串和图像绘制现在是线程安全的。

    • 现在可以安全地使用多个线程中的颜色和字体对象。

大卫邓肯在这里的评论中证实了这一点 。

除此之外,关于UIKit的其他所有内容都不被认为是线程安全的,因此在这些情况下你应确保在主线程上与它进行交互。

顺便说一句 ,我更喜欢基于块的实现“总是在主线程上运行”函数而不是链接到的宏,因为我喜欢显式包装需要在主线程上运行的代码。

经验法则: 任何更新接口的东西都必须在主线程上。