例如,Java Swing和Android UI都使用单线程模型,其中单个UI线程负责更新所有UI.是什么让框架设计师选择了一个线程模型而不是另一个?
多线程UI模型不会以更复杂的代价为您提供更多性能吗?我意识到后者是一个大问题,因为线程相关的错误很讨厌,但我想知道除了简单性之外单线程模型是否还有其他优点?
http://weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html认为多线程GUI框架是一个失败的梦想.那么非GUI框架呢?这个经验法则是否扩展到所有事件驱动的框架?
以下是引起我注意的文章的引用:
输入事件处理的问题在于它倾向于以与大多数GUI活动相反的方向运行.通常,GUI操作从一堆库抽象的顶部开始并"向下".我在我的应用程序中运行一个由一些GUI对象表示的抽象概念,所以我从我的应用程序开始,调用高级GUI抽象,调用较低级别的GUI抽象,调用丑陋的内容.工具包,然后进入操作系统.相比之下,输入事件从OS层开始,逐步向上调度抽象层,直到它们到达我的应用程序代码.
现在,由于我们使用抽象,我们自然会在每个抽象中单独进行锁定.不幸的是,我们有经典的锁定订单噩梦:我们有两种不同类型的活动,希望获得相反订单的锁定.所以僵局几乎是不可避免的.
我知道在更新UI时我们必须调用主线程.但我不能解释我的队友为什么要这样做以及为什么Swift不会自动完成.
他们曾经像这样调用self.present():
self.present(alert, animated: true)
Run Code Online (Sandbox Code Playgroud)
但我知道你应该这样称呼它:
DispatchQueue.main.async {
self.present(alert, animated: true)
}
Run Code Online (Sandbox Code Playgroud)
我实际上想确保在主线程上总是调用该方法,但我不知道如何...另一个问题是:为什么我必须确保在主线程而不是Swift上调用此方法?当有人调用此方法时,总会有UI更新.
@available(iOS 5.0, *)
open func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)
Run Code Online (Sandbox Code Playgroud)