如何修复NSInternalInconsistencyException?

时间:2015-10-20 03:08:02

标签: ios swift avplayer key-value-observing

每当我尝试使用AVPlayer从网址流式传输歌曲时,我都会收到NSInternalInconsistencyException错误。我在结构上创建了一个全局流播放器,以便我的流播放器可以全局使用。

这是我播放新歌的代码:

User.songPlayer = AVPlayer(URL: NSURL(string: User.streamSongUrl!)!)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: User.songPlayer?.currentItem)
User.songPlayer?.addObserver(self, forKeyPath: "status", options: [], context: nil)

slidetimer = NSTimer.scheduledTimerWithTimeInterval(0.0, target: self, selector: "updateSlider", userInfo: nil, repeats: true)
progressBar.hidden = true
progressTimerLabel.text = "PREVIEW"
progressMinTimeLabel.hidden = true

这是错误日志:

  

2015-10-20 10:00:41.453 joove [6466:141737] ***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'AVPlayer类的实例0x7f88138c2490已取消分配,而键值观察者仍在注册用它。目前的观察资料:(    上下文:0x0,属性:0x7f8815e6ca70>   )'

我该如何解决? 给我任何建议无关紧要obj-c或swift

2 个答案:

答案 0 :(得分:0)

错误很明显。您向AVPlayer添加了一个观察者,但在取消分配AVPlayer之前,您没有删除观察者。

更新您的代码,以便在播放器取消分配之前在removeObserver上致电User.songPlayer

答案 1 :(得分:0)

NSInternalInconsistencyException的一个常见原因是不会从KVO取消注册,导致不必要的崩溃,因为回调来到已经发布的对象。

请确保在取消分配时从所有通知中删除您的班级观察员。像这样:

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
    User.songPlayer.removeObserver(self, forKeyPath: "status")
}