【问题标题】:Why do we need to call the Main Thread for UI updates?为什么我们需要调用主线程进行 UI 更新?
【发布时间】:2018-12-13 08:21:42
【问题描述】:

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

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

self.present(alert, animated: true)

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

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

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

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

【问题讨论】:

  • But I know you should call it this way 不,你不应该。仅当当前线程是后台线程时,您才应该这样做。如果真的有这个问题,我无法理解。
  • 要回答为什么,请查看:stackoverflow.com/questions/31820336/…

标签: ios ios-multithreading


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2019-06-09
    相关资源
    最近更新 更多