我偶然发现了一位前开发人员编写的这段代码,但不明白其中的注释。
这似乎意味着使用外部DispatchQueue.main.async
调用将满足Apple使用主队列修改UIImageView的要求。
我的问题:我理解主队列被阻塞是因为它正在等待来自内部队列的同步响应。但是这种方法是否会使在主队列上强制调用 ImageView API 失效?它显然不再是主队列了。
private let imageViewQueue = DispatchQueue(label: "com.company.imageViewQueue")
private var imageView: UIImageView?
...
func updateImageView(viewer: UIImageView) {
// have to do this on the main queue as well AND make sure we guard our viewer
DispatchQueue.main.async {
self.imageViewQueue.sync {
self.imageView = viewer
}
}
}
感谢您提供的任何帮助,帮助我们了解这里发生的事情。
您说得对,使用
imageViewQueue
意味着该行self.imageView = viewer
不在主队列中执行。但是,由于您没有使用该行更新 UI,因此该行无需self.imageView = viewer
在主队列中执行。您只是在更新本地属性。因此,这段代码是双重错误。我会删除
imageViewQueue
及其所有用途。只需确保所有读取或设置的尝试都self.imageView
在主队列中完成即可。这样,诸如 的代码self.imageView.image = someImage
就会在主队列中执行,并且不会有两个线程可以更新self.imageView
。