【问题标题】:programmatically enabling buttons taking several seconds以编程方式启用按钮需要几秒钟
【发布时间】:2015-12-28 19:23:33
【问题描述】:

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

【问题讨论】:

标签: ios swift avfoundation avaudioplayernode


【解决方案1】:

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

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

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

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

检查代码是否在主线程上运行可以像这样快速完成:

print(NSThread.isMainThread())

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

【讨论】:

  • 我尝试从完成处理程序调用主线程函数,但没有帮助。
  • player.scheduleBuffer(buffer, completionHandler: { print("complete") completion() } )
  • 更新了答案,但你现在问的都是非常基本的问题,你应该在网上搜索一下
  • 这是一个比所选答案更好的解释。您可能想指出 NSOperationQueue 是一个高级抽象,它在后台使用 Grand Central Dispatch。 +1
  • @DanBeaulieu 感谢您的赞赏。是的,我使用了该 API,因为它是比 GCD 更高级别的 API,而且我发现它更具可读性和现代性 :)
【解决方案2】:

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

self.player.scheduleBuffer(buffer, completionHandler: {

    print("complete")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多