Swift中的AVPlayer观察者 - 已收到消息但未处理

Phi*_*son 15 ios swift

我正在尝试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)

  • 我想两次投票,你已经成为一个幸福的地方.:) (2认同)

Abd*_*eed 5

我更换方法后问题解决。

    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)