为什么视图没有及时更新?

Why is the view not updated on time?

我正在尝试更改点击时的 UIImageView alpha 属性。但是,属性的​​更改是在所有代码行为 运行 之后完成的,我希望它在单击完成后立即完成。为了简化代码,我更改了 sleep(2) 的所有代码行,因为它具有相同的效果。

点击功能

@IBAction func click_btn() {
    imageView.alpha = 0.5
    sleep(2)
}

我试过使用 DispatchQueueasync 方法,但结果是一样的。

如您所见,这是结果,当我单击按钮时,图像直到 2 秒睡眠时间后才发生变化。如何在点击后立即更改 alpha 属性?

这就是 iOS(和 Mac OS)上的事件循环的工作方式。 UI 更改会在您 运行 通过您的代码时排队,然后在您 return 并且应用程序访问事件循环后应用。您的延迟正在阻止更改的发生。如果您摆脱睡眠,它将按预期工作。

请注意,通常按钮点击会在“触摸内部”时触发,这意味着按钮只有在用户松开手指后才会响应。如果需要,您可以将操作附加到触地事件。

你真正想要完成的是什么?

编辑:

像这样重写你的代码:

@IBAction func click_btn() {
    imageView.alpha = 0.5
    DispatchQueue.main.async() {
       //Code that takes 2 seconds to run
    }
}

这将导致您的函数立即 return,并且您的 alpha 更改发生。在下一次通过事件循环时,系统将在主队列中找到您的异步任务,将其拾取并开始处理。请注意,在 运行 花费的 2 秒内,UI 将冻结。 运行 后台队列中的慢速代码可能更好,并且只在“慢位”完成后才更新 UI:

@IBAction func click_btn() {
    imageView.alpha = 0.5
    DispatchQueue. global().async {
       // Run the code that takes 2 seconds to run on a background thread
       DispatchQueue.main.async() {
           // Do your UI updates that have to run after the slow code finishes on the main thread.
    }
}