【问题标题】:Why is the view not updated on time?为什么视图没有及时更新?
【发布时间】:2021-06-17 17:29:37
【问题描述】:

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

点击功能

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

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

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

【问题讨论】:

    标签: ios swift uikit


    【解决方案1】:

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

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

    你真正想要完成什么?

    编辑:

    像这样重写你的代码:

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

    这将导致您的函数立即返回,并且您的 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.
        }
    }
    

    【讨论】:

    • 感谢您的回答!但是,它仍然没有解决mi问题。我用睡眠发布了答案以简化代码。我想要实现的是,当点击完成时,图像会改变它的 alpha 值并计算其他东西。其他的事情是很多代码行,需要大约 2 秒才能运行......
    • 另外,我对用户按住按钮没有任何问题。我只需要这样,当执行操作时,图像会在其他代码行运行之前更改它的 alpha 值...
    • 谢谢!使用 DispatchQueue.global().async 的解决方案效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2021-08-20
    • 2014-06-15
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多