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

时间:2015-12-28 19:23:33

标签: ios swift avfoundation avaudioplayernode

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

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()
            }
        )

2 个答案:

答案 0 :(得分:2)

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

检查主线程上是否正在运行完成处理程序,然后添加负责在主线程上更新UI的代码

为了快速检查UI未立即更新的原因,请尝试此操作,将代码另外放入完成处理程序中:

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

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

print(NSThread.isMainThread())

我假设您在寻找解决方案时放置layoutIfNeeded,没有更大的背景我不能100%肯定地说,但可能您不会需要它

答案 1 :(得分:1)

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

self.player.scheduleBuffer(buffer, completionHandler: {

    print("complete")

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