我正在使用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()
}
)
答案 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
})
})