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

时间:2016-06-14 17:28:15

标签: ios swift swift2 key-value-observing

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

$x("//div[@class='texter']//div[@class ='checkbox']

这之前使用过SwiftTryCatch,但是就行崩溃了“'无法删除关键路径”readyForDisplay“的观察者,因为它没有注册为观察者。'”或者观察者注册了如果我发表评论,则解除分配对象。

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

3 个答案:

答案 0 :(得分:5)

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

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

NSKeyValueObserving文档说:

  

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

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

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

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

答案 1 :(得分:0)

statusAVPlayerAVPlayerItem的属性。

readyForDisplayAVPlayerLayer

的属性

答案 2 :(得分:-1)

由于您在方法结束时拨打电话removeObserver(self),为什么不能取消上述代码?因为removeObserver(self)删除了所有观察者,如果注册了任何观察者。我希望这能解决你的问题。

NSNotificationCenter.defaultCenter().removeObserver(self)