为什么iOS更新UI操作必须在主线程
开发iOS应用程序的同学都知道UI操作如果在非主线程进行的话是会Crash的。
但是本质原因可能很少人真正明白。
如果我来回答的话,我的答案是:
UI操作涉及到渲染访问各种View对象的属性,如果是异步操作会有读写问题。加锁呢,性能损耗大(视图层次深,属性多)。所以主线程操作UI,是约定俗成的开发规则。
我们来看看Quora
网友关于这个”经典”问题的回答:
Why must the UI always be updated on Main Thread?
来自 Reinder de Vries 的回答:
The first one is that, in Cocoa Touch, the UIApplication gets set up on the main thread
Another reason is graphics rendering: the graphics pipeline of the iPhone is ultimately synchronous.
他的一个理由是:
- 在
Cocoa Touch
框架中,UIApplication
初始化工作是在主线程进行的。而界面上所有的视图都是在UIApplication 实例
的叶子节点(内存管理角度),所以所有的手势交互操作都是在主线程上才能响应 - 图形渲染在
iPhone
设备本质上是同步的。图形渲染计算最终要显示的像素值,以每秒60帧的频率刷新到屏幕上,绘制到屏幕的过程实际上就是通过LED display
点亮各个像素。这个过程需要一次将所有将要实现的像素刷新到屏幕上(同时的)。如果要异步化的话,对应的你无法确定这个处理过程是否真正的全部完成。
他最后指出,在主线程操作UI。能帮助你避免不少的麻烦和减少产生产品缺陷。当然,有部分UI操作是可异步化的,只要最后的更新操作是在主线程
- 叠加滤镜效果在视图上
- 创建动态图形,比如动画
最后推荐了WWDC
上关于UI渲染的录像 Building Concurrent User Interfaces on iOS