为什么我们需要调用主线程进行UI更新?

God*_*ike 1 ios ios-multithreading

我知道在更新UI时我们必须调用主线程.但我不能解释我的队友为什么要这样做以及为什么Swift不会自动完成.

他们曾经像这样调用self.present():

self.present(alert, animated: true)
Run Code Online (Sandbox Code Playgroud)

但我知道你应该这样称呼它:

DispatchQueue.main.async {
      self.present(alert, animated: true)
}
Run Code Online (Sandbox Code Playgroud)

我实际上想确保在主线程上总是调用该方法,但我不知道如何...另一个问题是:为什么我必须确保在主线程而不是Swift上调用此方法?当有人调用此方法时,总会有UI更新.

@available(iOS 5.0, *)
open func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)
Run Code Online (Sandbox Code Playgroud)

And*_*jen 10

每个UI框架中都有一个(几乎?)单个UI线程,并且必须在此执行所有UI操作.我认为这种设计的主要原因是为了防止意外的UI行为.考虑以下情况:

  • 表中有一个条目列表,称之为"A"和"B"
  • 目前选择"A"
  • 用户想要删除"B"
    • 用户选择"B"
    • 用户按下"删除所选条目"按钮

如果用户使用快速点击器/ tapper,并且UI是多线程的,那么可能会在"删除所选条目"处理程序之后执行" select B"事件处理程序.因此,仍然选择"A"并将其删除.

因此,典型的框架会跟踪队列中的事件并按严格的顺序处理此队列.这就是你所说的"单线程".

因此,如果您将某些内容分配到主线程中,您应该知道执行的时间是不确定的,因此您不能在排队时依赖任何UI状态.