我知道在更新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)
答案 0 :(得分:6)
每个UI框架(几乎?)中只有一个UI线程,因此必须在其中执行所有UI操作。我认为这种设计的主要原因是为了防止意外的UI行为。考虑以下情况:
如果用户在其中使用了快速单击器/攻丝器和UI,则可能是在<删除>之后删除>后删除了“选择B”事件处理程序。因此,“ A”仍处于选中状态,将被删除。
因此,典型的框架会跟踪队列中的事件并以严格的顺序处理该队列。这就是您所说的“单线程”。
因此,如果在主线程中调度某些内容,则应注意执行时间不确定,因此在入队时一定不要依赖任何UI状态。