Наблюдатель AVPlayer в Swift - сообщение было получено, но не обработано

Я пытаюсь реализовать наблюдателя для AVPlayer в чистом Swift.

Я получаю сообщение об ошибке: "сообщение получено, но не обработано". Это потому, что аргумент объекта в конструкторе наблюдателя, который я использую, это 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)")
        }
}

Ответы

Ответ 1

Обычно эта проблема возникает, когда зарегистрированный наблюдатель освобождается и после этого запускается событие KVO. Для исправления вам нужно удалить всех наблюдателей, прежде чем ваш объект будет освобожден.

В вашем случае вы зарегистрировались на 4 изменения KVO и удалили только 3. Следующий наблюдатель KVO нигде не удаляется, и это вызывает проблему.

player.addObserver(self, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions(), context: nil)

Измените свой метод 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")
}

Ответ 2

Я решил проблему после замены метода.

    override func addObserver(_ observer: NSObject, forKeyPath keyPath: String, options: NSKeyValueObservingOptions = [], context: UnsafeMutableRawPointer?) {}

Для

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {}