1

我正在使用 AVFoundation 并使用 AVAudioPlayerNode 创建一个快速应用程序。我在播放时禁用播放按钮,并在播放器的完成部分启用它,但按钮保持透明超过 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()
            }
        )
4

2 回答 2

2

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

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

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

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

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

print(NSThread.isMainThread())

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

于 2015-12-28T19:35:46.983 回答
1

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

self.player.scheduleBuffer(buffer, completionHandler: {

    print("complete")

    dispatch_async(dispatch_get_main_queue(),{
    self.playButton.enabled = true
    })
})
于 2015-12-28T19:53:58.193 回答