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

时间:2018-12-13 08:21:43

标签: ios ios-multithreading

我知道在更新UI时必须调用主线程。 但是我无法解释我的队友为什么我们必须这样做以及为什么Swift不会自动做到这一点。

他们曾经这样称呼self.present():

self.present(alert, animated: true)

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

DispatchQueue.main.async {
      self.present(alert, animated: true)
}

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

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

1 个答案:

答案 0 :(得分:6)

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

  • 表中有一个条目列表,称它们为“ A”和“ B”
  • 当前已选择“ A”
  • 用户想要删除“ B”
    • 用户选择“ B”
    • 用户按下“删除所选条目”按钮

如果用户在其中使用了快速单击器/攻丝器和UI,则可能是在<删除>之后后删除了“选择B”事件处理程序。因此,“ A”仍处于选中状态,将被删除。

因此,典型的框架会跟踪队列中的事件并以严格的顺序处理该队列。这就是您所说的“单线程”。

因此,如果在主线程中调度某些内容,则应注意执行时间不确定,因此在入队时一定不要依赖任何UI状态。