我有一个视频应用程序,我在Swift 1中建立了一段时间,我一直在尝试迁移到Swift 2.2。这一切(最终)与观察者的奇怪崩溃不同。
$x("//div[@class='texter']//div[@class ='checkbox']
这之前使用过SwiftTryCatch,但是就行崩溃了“'无法删除关键路径”readyForDisplay“的观察者,因为它没有注册为观察者。'”或者观察者注册了如果我发表评论,则解除分配对象。
如果我向它添加一个do {} catch {},我会收到一个“不会抛出”的错误,它只会崩溃。我如何将其置于某种形式的try-catch格式?
答案 0 :(得分:5)
在Swift 2中,libs对于真正意外发生的错误(抛出)与程序员可能阻止的错误(不抛出,但只是使应用程序崩溃)非常严格。
(我不是这种区别的粉丝,或者至少不是Apple所做出的关于哪些错误属于哪个类别的具体决定.JSON API接受了这个部门的荒谬。但......我们使用我们有API。)
NSKeyValueObserving
文档说:
如果对象尚未注册为观察者,则调用
removeObserver:forKeyPath:
是错误的。
“这是一个错误”是Apple的代码,“你有责任从不这样做,如果你这样做,你的应用程序将以无法捕获的方式崩溃。”
在这些情况下,通常会进行API调用以检查您即将执行的操作的有效性。但是,AFAIK,没有KVO API调用你可以问,“X是否观察对象Z的关键路径Y?”这意味着你有三个选择:
答案 1 :(得分:0)
status
是AVPlayer
或AVPlayerItem
的属性。
readyForDisplay
是AVPlayerLayer
答案 2 :(得分:-1)
由于您在方法结束时拨打电话removeObserver(self)
,为什么不能取消上述代码?因为removeObserver(self)
删除了所有观察者,如果注册了任何观察者。我希望这能解决你的问题。
NSNotificationCenter.defaultCenter().removeObserver(self)