Наблюдатель 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?) {}