为什么视图没有及时更新?
Why is the view not updated on time?
我正在尝试更改点击时的 UIImageView alpha 属性。但是,属性的更改是在所有代码行为 运行 之后完成的,我希望它在单击完成后立即完成。为了简化代码,我更改了 sleep(2)
的所有代码行,因为它具有相同的效果。
点击功能
@IBAction func click_btn() {
imageView.alpha = 0.5
sleep(2)
}
我试过使用 DispatchQueue
和 async
方法,但结果是一样的。
如您所见,这是结果,当我单击按钮时,图像直到 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.
}
}
我正在尝试更改点击时的 UIImageView alpha 属性。但是,属性的更改是在所有代码行为 运行 之后完成的,我希望它在单击完成后立即完成。为了简化代码,我更改了 sleep(2)
的所有代码行,因为它具有相同的效果。
点击功能
@IBAction func click_btn() {
imageView.alpha = 0.5
sleep(2)
}
我试过使用 DispatchQueue
和 async
方法,但结果是一样的。
如您所见,这是结果,当我单击按钮时,图像直到 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.
}
}