Ios 以编程方式启用按钮需要几秒钟
我正在使用AVFoundation和AVAudioPlayerNode创建一个swift应用程序。我在播放时禁用播放按钮,在播放器的完成部分我启用了它,但按钮保持透明超过10秒。 按钮可用,我的打印(“完成”)立即显示,因此视图似乎没有更新。这是我的密码:Ios 以编程方式启用按钮需要几秒钟,ios,swift,avfoundation,avaudioplayernode,Ios,Swift,Avfoundation,Avaudioplayernode,我正在使用AVFoundation和AVAudioPlayerNode创建一个swift应用程序。我在播放时禁用播放按钮,在播放器的完成部分我启用了它,但按钮保持透明超过10秒。 按钮可用,我的打印(“完成”)立即显示,因此视图似乎没有更新。这是我的密码: player.scheduleBuffer(buffer, completionHandler: { print("complete") self.playButto
player.scheduleBuffer(buffer, completionHandler: {
print("complete")
self.playButton.enabled = true
}
)
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
我尝试了以下方法,但没有成功:
self.view.layoutIfNeeded()
player.scheduleBuffer(buffer, completionHandler: {
print("complete")
self.playButton.enabled = true
self.playButton.reloadInputViews()
self.view.layoutIfNeeded()
}
)
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
这可能是因为没有在负责更新UI的主线程上调用完成处理程序
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
检查完成处理程序是否在主线程上运行,如果没有,则添加负责更新主线程上UI的代码
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
要快速检查UI未立即更新的原因,请尝试以下方法,将代码另外放入完成处理程序中:
NSOperationQueue.mainQueue().addOperationWithBlock({
print("complete")
self.playButton.enabled = true
self.playButton.reloadInputViews()
self.view.layoutIfNeeded()
})
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
检查代码是否在主线程上运行可以在swift中完成,如:
print(NSThread.isMainThread())
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
我假设您在寻找解决方案时放置了
layoutIfNeeded
,没有更大的上下文,我不能100%肯定地说,但您可能不需要它完成处理程序不在主线程中。您可以使用以下代码移动该部分代码:
self.player.scheduleBuffer(buffer, completionHandler: {
print("complete")
dispatch_async(dispatch_get_main_queue(),{
self.playButton.enabled = true
})
})
我尝试从完成处理程序调用一个主线程函数,但没有任何帮助。player.scheduleBuffer(buffer,completionHandler:{print(“complete”)completion()})更新了答案,但您现在问的都是非常基本的问题,你应该在网上搜索它们。这是一个比所选答案更好的解释。您可能想指出,NSOperationQueue是一个高级抽象,它在后台使用了大中央调度+1@DanBeaulieu谢谢你的感激。是的,我使用了该API,因为它是比GCD更高级别的API,而且我发现它更具可读性和现代性:)许多副本之一: