KVO w=10=sh n w=11=sh
KVO AVPlayer.status in Swift
我需要观察 AVPlayer.status 变化。
我有一个 AVPlayer 实例和一个 context 变量
private var lastPlayer : AVPlayer?
private var playerStatusContext = 0
在我设置好 AVPlayer 实例后,我添加了一个 observer,如下所示:
// 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
}
}
问题是 change 要么是 0 key/value 字典,要么是一些(不管那是什么意思)和我的本地 status常量总是 nil,所以我不能做我的事情。
也许我错误地将 change 转换为 AVPlayerStatus?请帮忙。谢谢。
嗯,好像是这样投的
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!!!
}
}
}
不过我不确定这是最好的方法。
我需要观察 AVPlayer.status 变化。
我有一个 AVPlayer 实例和一个 context 变量
private var lastPlayer : AVPlayer?
private var playerStatusContext = 0
在我设置好 AVPlayer 实例后,我添加了一个 observer,如下所示:
// 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
}
}
问题是 change 要么是 0 key/value 字典,要么是一些(不管那是什么意思)和我的本地 status常量总是 nil,所以我不能做我的事情。
也许我错误地将 change 转换为 AVPlayerStatus?请帮忙。谢谢。
嗯,好像是这样投的
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!!!
}
}
}
不过我不确定这是最好的方法。