我正在尝试AVPlayer在纯Swift中实现一个观察者.
我收到错误:"收到邮件但未处理".是因为我正在使用的观察者的构造函数中的object参数是nil?
我在下面放置了我的示例代码:
player.addObserver(self, forKeyPath: "status", options:NSKeyValueObservingOptions(), context: nil)
player.addObserver(self, forKeyPath: "playbackBufferEmpty", options:NSKeyValueObservingOptions(), context: nil)
player.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options:NSKeyValueObservingOptions(), context: nil)
player.addObserver(self, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions(), context: nil)
private func deallocObservers(player: AVPlayer) {
player.removeObserver(self, forKeyPath: "status")
player.removeObserver(self, forKeyPath: "playbackBufferEmpty")
player.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp")
}
//observer for av play
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "status" {
print("Change at keyPath = \(keyPath) for \(object)")
}
if keyPath == "playbackBufferEmpty" {
print("playbackBufferEmpty - Change at keyPath = \(keyPath) for \(object)")
}
if keyPath == "playbackLikelyToKeepUp" {
print("Change at keyPath = \(keyPath) for \(object)")
}
}
Run Code Online (Sandbox Code Playgroud)
Mid*_* MP 17
通常,当注册的观察者解除分配并且在此之后触发KVO事件时,会发生此问题.要进行修复,您需要在取消分配对象之前删除所有观察者.
在您的情况下,您注册了4个KVO更改并仅删除3.以下KVO观察者未在任何地方删除,这导致了问题.
player.addObserver(self, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions(), context: nil)
Run Code Online (Sandbox Code Playgroud)
改变你的deallocObservers:方法,如:
private func deallocObservers(player: AVPlayer) {
player.removeObserver(self, forKeyPath: "status")
player.removeObserver(self, forKeyPath: "playbackBufferEmpty")
player.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp")
player.removeObserver(self, forKeyPath: "loadedTimeRanges")
}
Run Code Online (Sandbox Code Playgroud)
我更换方法后问题解决。
override func addObserver(_ observer: NSObject, forKeyPath keyPath: String, options: NSKeyValueObservingOptions = [], context: UnsafeMutableRawPointer?) {}
Run Code Online (Sandbox Code Playgroud)
到
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11381 次 |
| 最近记录: |