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

Ios 以编程方式启用按钮需要几秒钟,ios,swift,avfoundation,avaudioplayernode,Ios,Swift,Avfoundation,Avaudioplayernode,我正在使用AVFoundation和AVAudioPlayerNode创建一个swift应用程序。我在播放时禁用播放按钮,在播放器的完成部分我启用了它,但按钮保持透明超过10秒。 按钮可用,我的打印(“完成”)立即显示,因此视图似乎没有更新。这是我的密码: player.scheduleBuffer(buffer, completionHandler: { print("complete") self.playButto

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

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,而且我发现它更具可读性和现代性:)许多副本之一: