为什么必须在主线程操作UI

4,945 阅读1分钟

从 UIKit 说起

我们首先先了解一下 UIKit | Apple Developer Documentation ,简单概括就是在 主线程 响应用户事件、展示视图。文档里面特别强调了一段话:

Important
Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.

这段话强调了 UIKit 所有类(尤其是 UIResponder 的派生类),除非另有说明,否则只能在以下两个场景里面调用:

  • main thread - 主线程
  • main dispatch queue - 主调度队列

Why?

我们思考一下,在主线程来执行 UIKit 类,目的是为了保证线程安全。那么,从而就能知道 UIKit 一定 不是线程安全 的类,如果我们同时在多个线程来进行 UI 的异步操作,肯定造成读写问题,但是为了保证 UI 的流畅性,对 UIKit 做加锁则会导致大量的性能消耗,从而影响运行、渲染速度。

另外还有一点,根据事件响应机制(UIResponder)知道,所有的事件响应一定是在主线程。所以文档中规定 UI 操作一定要在主线程中串行执行,其实就是人为的加锁,既高效又同时保证了线程安全。