我有一个视频应用程序,是我在 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 {} 到它,我会得到一个错误“这不会抛出”,并且它只会崩溃。我该如何将其放入某种形式的 try-catch 格式中?
在 Swift 2 中,库对真正意外的错误(抛出)与程序员本可以防止的错误(这确实not抛出,但只是让你的应用程序崩溃)。
(我不喜欢这种区别,或者至少不喜欢苹果公司做出的关于哪些错误属于哪个类别的所有具体决定。JSON API 在这个部门近乎荒谬。但是……我们使用我们的 API有。)
The NSKeyValueObserving
文档说:
调用时出错removeObserver:forKeyPath:
如果该对象尚未注册为观察者。
“这是一个错误”是苹果公司的代码,意思是“你有责任永远不这样做,如果你这样做,你的应用程序将以无法捕获的方式崩溃。”
在这些情况下,您通常可以调用 API 来检查您要做的事情的有效性。然而,据我所知,您无法调用 KVO API 来询问“X 是否正在观察对象 Z 的关键路径 Y?”这意味着您有三个选择:
- 弄清楚为什么你试图从你没有观察到的东西中删除观察者,并使用程序自己的内部逻辑来防止这种情况发生。
- 为“我正在观察的玩家”保留一个弱实例变量,并在尝试删除观察者之前检查是否匹配。
- 在删除 self 之前将其添加为观察者。 (我很确定冗余添加是可以的。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)