为什么需要在UI更新时调用主线程?

6

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

不,你不应该这样做。只有在当前线程是后台线程时才应该这样做。如果真的有问题,我无法理解这个问题。 - Desdenova
2
回答为什么,请查看此链接:https://dev59.com/uFwZ5IYBdhLWcg3wINPQ - Andreas Oetjen
1个回答

14

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

  • 表格中有一列条目,称之为"A"和"B"
  • 当前选中的是"A"
  • 用户想删除"B"
    • 用户选择"B"
    • 用户按下"删除选定条目"按钮

如果用户点击/敲击速度很快,而UI是多线程的,则可能发生“选择B”事件处理程序在“删除所选条目”处理程序之后执行的情况。因此,“A”仍然被选中并将被删除。

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

因此,如果您将某些内容调度到主线程中,请注意执行时间是不确定的,因此您不能依赖于排队时任何UI状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接