每当我尝试使用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
答案 0 :(得分:0)
错误很明显。您向AVPlayer
添加了一个观察者,但在取消分配AVPlayer
之前,您没有删除观察者。
更新您的代码,以便在播放器取消分配之前在removeObserver
上致电User.songPlayer
。
答案 1 :(得分:0)
NSInternalInconsistencyException
的一个常见原因是不会从KVO取消注册,导致不必要的崩溃,因为回调来到已经发布的对象。
请确保在取消分配时从所有通知中删除您的班级观察员。像这样:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
User.songPlayer.removeObserver(self, forKeyPath: "status")
}