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

Mar*_*tin 3 key-value-observing ios swift swift2

我有一个视频应用程序,我在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)

}
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*ell 5

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

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

NSKeyValueObserving文件说:

removeObserver:forKeyPath:如果对象尚未注册为观察者,则调用是错误的.

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

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

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