AVPlayer在Swift 2.2中删除观察者崩溃

我有一个video应用程序,我在Swift 1中建立了一段时间,我一直在尝试迁移到Swift 2.2。 这一切(最终)与观察者的奇怪崩溃不同。

func removeObservers() { print("REMOVING OBSERVERS") if ( !self.is_image && self.player != nil ) { if (self.player?.observationInfo != nil) { self.player?.removeObserver(self, forKeyPath: "currentItem.status") self.player?.removeObserver(self, forKeyPath: "readyForDisplay") } } NSNotificationCenter.defaultCenter().removeObserver(self) } 

这在以前使用SwiftTryCatch工作,但是就地线崩溃了“’无法删除关键路径”readyForDisplay“的观察者,因为它没有注册为观察者。’”或者说,观察者在已解除分配的对象上注册我发表评论。

如果我向它添加一个do {} catch {},我会得到一个错误,“这不会抛出”,它只会崩溃。 我如何将其置于某种forms的try-catch格式中?

在Swift 2中,libs对于真正意外发生的错误(抛出)与程序员可能阻止的错误( 抛出,但只是使应用程序崩溃)非常严格。

(我不是这种区别的粉丝,或者至少不是Apple所做出的关于哪些错误属于哪个类别的具体决定。在这个部门中,JSON API接近荒谬。但是……我们使用API​​我们’得到了。)

NSKeyValueObserving文档说:

调用removeObserver:forKeyPath:如果对象尚未注册为观察者,则会出错。

“这是一个错误”是Apple的代码,“你有责任从不这样做,如果你这样做,你的应用程序将以无法捕捉的方式崩溃。”

在这些情况下,通常会进行API调用以检查您将要执行的操作的有效性。 但是,AFAIK,没有KVO API调用你可以问,“X是否观察对象Z的关键路径Y?”这意味着你有三个选择:

  • 弄清楚为什么你试图从你没有观察到的东西中移除一个观察者,并使用你自己的程序自己的内部逻辑来阻止它。
  • 为“我正在观察的玩家”保留一个弱实例var,并在尝试移除观察者之前检查匹配。
  • 在删除之前添加self作为观察者。 (我很确定冗余添加是可以的。)

statusAVPlayerAVPlayerItem的属性。

readyForDisplayAVPlayerLayer一个属性

由于您在方法结束时调用removeObserver(self) ,为什么removeObserver(self)注释上面的代码? 因为如果注册any, removeObserver(self)会删除所有观察者。 我希望这能解决你的问题。

 NSNotificationCenter.defaultCenter().removeObserver(self)