关于KVO关键路径操作的AVPlayerLayer崩溃

时间:2018-07-27 05:53:22

标签: avplayer key-value-observing

最近我在下载时使用AVPlayer播放,一切似乎都很好。错误我发现有关AVPlayerLayer的崩溃。

这样的错误信息:

类AVPlayerLayer的实例0x170038f60被释放,而键值观察者仍在注册。当前观察信息:NSKeyValueObservationInfo 0x174e38040>(NSKeyValueObservance 0x17465ec90:观察者:0x170a62c40,关键路径: operationCount ,选项:新建:否,旧:否,优先级:否>上下文:0x0,属性:0x17465ede0>)

我无法繁殖,也不知道如何解决。你能帮我么 ?谢谢。

1 个答案:

答案 0 :(得分:0)

这种情况发生在播放器层被释放但观察者仍然附着的情况下。

您应删除先前已添加到 AVPlayerLayer AVPlayerItem 实例的 playerLayerObserver PlayerItemObservers 在viewController的 deinit 方法中。

deinit {
    guard videoPlayer != nil else { return }
    self.playerLayer.removeObserver(self, forKeyPath: PlayerReadyForDisplayKey, context: &PlayerLayerObserverContext)
    removePlayerItemObservers(item: self.avPlayerItem)

    videoPlayer?.replaceCurrentItem(with: nil)
}

这样您可以删除观察者

internal func removePlayerItemObservers(item: AVPlayerItem) {
    if (item.observationInfo != nil) {
        //NOTE:- REMOVE ONLY FOR THE OBSERVERS THAT YOU HAVE ADDED PREVIOUSLY ON ITEM
        item.removeObserver(self, forKeyPath: "status")
        item.removeObserver(self, forKeyPath: "loadedTimeRanges")
        item.removeObserver(self, forKeyPath: "playbackBufferEmpty")
        item.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp")
        item.removeObserver(self, forKeyPath: "isPlaybackBufferFull")
    }
}

尝试并分享结果。