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



我知道在更新UI时必须调用主线程。但我无法解释我的队友们为什么我们必须这样做,为什么斯威夫特没有自动做到。

他们过去这样称呼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)

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

  • 表中有一个条目列表,称它们为"a"one_answers"B">
  • "A"当前已选定
  • 用户想要删除"B">
    • 用户选择"B">
    • 用户按下"删除所选条目"按钮

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

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

因此,如果将某个东西分派到主线程中,则应该注意执行时间是不确定的,因此在排队时不能依赖任何UI状态。

最新更新