【问题标题】:AVPlayer removing observer crash in Swift 2.2AVPlayer 消除 Swift 2.2 中的观察者崩溃
【发布时间】:2016-06-14 17:28:15
【问题描述】:

我有一段时间在 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 时有效,但是在原位崩溃时出现“'Cannot remove anobserver for the key path "readyForDisplay" from because it is not registered as an observer.'”或者观察者注册在如果我将其注释掉,则释放对象。

如果我向它添加一个 do { } catch {} ,我会收到一个“这不会抛出”的错误,它只会崩溃。我该如何去把它放在某种形式的 try-catch 格式中?

【问题讨论】:

  • 我遇到了一个与此非常相似的问题。您是否在代码的任何其他部分中删除了该观察者?最简单的方法可能是统一创建和删除观察者的位置......我在显示后删除了 readyForDisplay,但是当 dealloc 出现时无法删除它。

标签: ios swift swift2 key-value-observing


【解决方案1】:

在 Swift 2 中,库对真正意外(抛出)的错误与程序员本可以阻止的错误(不会抛出,但只会让你的应用程序崩溃)变得非常严格。

(我不喜欢这种区别,或者至少不喜欢 Apple 关于哪些错误属于哪个类别做出的所有具体决定。JSON API 在这个部门几乎是荒谬的。但是......我们与我们有 API。)

NSKeyValueObserving 文档说:

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

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

在这些情况下,您通常可以调用 API 来检查您将要做的事情的有效性。但是,AFAIK,您无法调用 KVO API 来询问“X 是否观察对象 Z 的关键路径 Y?”这意味着您有三个选择:

  • 找出您为什么要尝试从您没有观察到的事物中移除观察者,并使用您的程序自己的内部逻辑来防止这种情况发生。
  • 为“我正在观察的玩家”保留一个弱实例变量,并在尝试移除观察者之前检查它是否匹配。
  • 在删除之前将self添加为观察者。 (我很确定多余的添加是可以的。)

【讨论】:

  • 我尝试添加一个布尔值来表示观察者已设置并意识到在某些情况下您被删除了两次,以便修复它。谢谢。
【解决方案2】:

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

NSNotificationCenter.defaultCenter().removeObserver(self)

【讨论】:

  • KVO 通知是否通过 NSNotificationCenter?我不确定这是否有效。很高兴知道它是否存在!
【解决方案3】:

statusAVPlayerAVPlayerItem 的属性。

readyForDisplayAVPlayerLayer 的属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多