4

我知道我们在更新 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)
4

1 回答 1

13

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

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

如果用户使用快速点击器/点击器,并且 UI 是多线程的,那么可能会发生“选择 B”事件处理程序“删除选定条目”处理程序之后执行。因此,“A”仍被选中并将被删除。

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

因此,如果你在主线程中 dispatch 一些东西,你应该知道执行时间是不确定的,所以在入队时你不能依赖任何 UI 状态。

于 2018-12-13T09:09:01.563 回答