我写了一个名为ensureInMainThread的小定义(我用了很多)。但是,我不确定在主线程上确切调用哪些用户界面方法需要。那么setNeedsDisplay
和setNeedsLayout
怎么样?需要在iOS 5.x中的主线程上调用的方法的经验法则是什么?
这些问题是相关的(一些低质量的问题和答案,以及一些非常具体的案例),但我想要一个全面,单一的好答案:
答案 0 :(得分:9)
从iOS 4.0开始,some user interface updates can be performed on a background thread:
在UIKit中绘制图形上下文现在是线程安全的。具体做法是:
用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文。
字符串和图像绘制现在是线程安全的。
现在可以安全地使用多个线程中的颜色和字体对象。
David Duncan在他的评论here中证实了这一点。
除此之外,关于UIKit的其他所有内容都不被认为是线程安全的,因此在这些情况下你应确保在主线程上与它进行交互。
顺便说一句,我更喜欢my block-based implementation of a "always run on the main thread" function而不是你链接的宏,因为我喜欢显式包装需要在主线程上运行的代码。
答案 1 :(得分:3)
经验法则:更新接口的 Anything 必须在主线程上。
答案 2 :(得分:0)
在iOS 12中,如果您从后台线程调用setNeedsDisplay,则会得到以下断言:
主线程检查器:在后台线程上调用的UI API:-[UIView setNeedsDisplay]