【发布时间】:2018-06-14 13:59:46
【问题描述】:
我了解到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。
我有各种功能来执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应该只更新 UI 吗?我可以/应该在另一个线程上运行条件检查吗?这是否取决于函数的作用或您希望它完成的速度?
一个无需线程即可更改 ImageView 内图像的函数示例:
@IBAction func undoPressed(_ sender: Any) {
if !previousDrawings.isEmpty {
previousDrawings.remove(at: previousDrawings.count - 1)
if let lastDrawing = previousDrawings.last {
topImageView.image = lastDrawing
}
else {
// empty
topImageView.image = nil
}
}
}
我应该在主线程上设置topImageView.image 吗?像这样:
@IBAction func undoPressed(_ sender: Any) {
if !previousDrawings.isEmpty {
previousDrawings.remove(at: previousDrawings.count - 1)
if let lastDrawing = previousDrawings.last {
DispatchQueue.main.async {
self.topImageView.image = lastDrawing
}
}
else {
DispatchQueue.main.async {
self.topImageView.image = nil
}
}
}
}
我应该使用后台线程进行条件检查吗?像这样:
@IBAction func undoPressed(_ sender: Any) {
DispatchQueue.global(qos: .utility).async {
if !previousDrawings.isEmpty {
previousDrawings.remove(at: previousDrawings.count - 1)
if let lastDrawing = previousDrawings.last {
DispatchQueue.main.async {
self.topImageView.image = lastDrawing
}
}
else {
DispatchQueue.main.async {
self.topImageView.image = nil
}
}
}
}
}
如果有人可以解释首选哪种方法以及为什么这会真正有帮助。
【问题讨论】:
-
GAK。远离 GCD。您显示的所有代码都不应该在后台线程上执行,因此您根本不需要像
DispatchQueue.global(qos: .utility).async或DispatchQueue.main.async这样的任何 GCD 调用。看我的回答。您的函数不会在后台线程上调用,除非在特殊的、有据可查的情况下。 -
“我应该使用后台线程进行条件检查吗?像这样:”块中的代码会引起很多混乱,因为您现在正在不同线程上执行一些代码,并且它可能(可能)以与您预期不同的顺序执行。
标签: ios swift multithreading user-interface