为什么即使在主线程上也需要使用 DispatchQueue.main.async 设置 UIImageView.image

use*_*147 3 uikit ios swift

试图在点击时在按钮上设置图像。验证 targetAction 处理程序总是在主线程上调用。

这不起作用

@objc func buttonTapped() {
     self.mybutton.imageView?.image = MyObjcClass.getImageNamed("DarkVersion")
}
Run Code Online (Sandbox Code Playgroud)

但这有效:

@objc func buttonTapped() {
    DispatchQueue.main.async { // Does not work without this dispatch
        self.mybutton.imageView?.image = MyObjcClass.getImageNamed("DarkVersion")
    }
}
Run Code Online (Sandbox Code Playgroud)

在调试器上,我可以看到两者都在主线程上

And*_*nov 5

将图像设置为按钮的正确方法是使用setImage(_ image: UIImage?,for state: UIControl.State) 方法
当您使用直接访问设置图像时,按钮不知道它并在状态更改例程中更改设置图像。
实际上,您不需要在按钮的动作方法中更改图像,您只需要为状态设置图像并在此方法中更改按钮的状态。Button'll为 state选择合适的图像。