Swift中的KVO AVPlayer.status

时间:2017-08-16 21:04:31

标签: ios swift avplayer key-value-observing

我需要观察 AVPlayer.status 更改。

我有 AVPlayer 实例和上下文变量

private var lastPlayer : AVPlayer?
private var playerStatusContext = 0

在我设置 AVPlayer 实例后,我添加了观察者,如下所示:

//  KVO status property
self.lastPlayer!.addObserver(self, forKeyPath: "status", options: [.new, .initial], context: &playerStatusContext)

然后我已经覆盖了 observeValue 这样的功能:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{
    let status : AVPlayerStatus? = change?[.newKey] as? AVPlayerStatus
    if(status != nil && context == &playerStatusContext)
    {
        //  DO MY STUFF
    }
}

问题是更改是0键/值字典或某些(无论这意味着什么),我的本地状态常量始终是 nil ,hense我不能做我的东西。

也许我错误地将更改转换为 AVPlayerStatus ?请帮忙。感谢。

1 个答案:

答案 0 :(得分:2)

嗯,看起来像是这样投射

let status : AVPlayerStatus? = change?[.newKey] as? AVPlayerStatus

不起作用。当尝试检查更改为零时,应用程序崩溃,然后强行打开它。使用原始值有助于:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{
    //  Check status
    if keyPath == "status" && context == &playerStatusContext && change != nil
    {
        let status = change![.newKey] as! Int
        //  Status is not unknown
        if(status != AVPlayerStatus.unknown.rawValue)
        {
            //  DO STUFF!!!
        }
    }
}

我不确定这是最好的方式。