以编程方式启用按钮需要几秒钟

programmatically enabling buttons taking several seconds

我正在使用 AVFoundation 和 AVAudioPlayerNode 创建一个 swift 应用程序。我在播放时禁用播放按钮,并在播放器的完成部分启用它,但该按钮保持透明超过 10 秒。 该按钮可用,我的 print("complete") 立即显示,因此视图似乎没有更新。这是我的代码:

player.scheduleBuffer(buffer, completionHandler: {              
            print("complete")
            self.playButton.enabled = true
            }
        )

我尝试了以下方法但没有成功:

self.view.layoutIfNeeded()
player.scheduleBuffer(buffer, completionHandler: {
            print("complete")
            self.playButton.enabled = true
            self.playButton.reloadInputViews()
            self.view.layoutIfNeeded()
            }
        )

这可能是因为没有在负责更新的主线程上调用完成处理程序 UI。

检查完成处理程序是否在主线程上 运行 如果不是,则添加负责在主线程上更新 UI 的代码

为了快速检查 UI 没有立即更新的原因,试试这个,将代码放在完成处理程序中:

NSOperationQueue.mainQueue().addOperationWithBlock({
       print("complete")
        self.playButton.enabled = true
        self.playButton.reloadInputViews()
        self.view.layoutIfNeeded()
    })

检查主线程上的代码是否 运行 可以在 swift 中完成,例如:

print(NSThread.isMainThread())

我假设你在寻找解决方案时放置了 layoutIfNeeded,没有更大的上下文我不能 100% 肯定地说但可能你不需要它

完成处理程序不在主线程中。您可以使用以下代码移动该部分代码:

self.player.scheduleBuffer(buffer, completionHandler: {

    print("complete")

    dispatch_async(dispatch_get_main_queue(),{
    self.playButton.enabled = true
    })
})