我读过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
}
}
}
}
}
如果有人能解释一下哪种方法更好,并说明原因,那将非常有帮助。
DispatchQueue.global(qos: .utility).async
或DispatchQueue.main.async
。请参考我的答案。除非在特殊的、有文档记录的情况下,否则你的函数不会在后台线程上被调用。 - Duncan C