【问题标题】:How to set AVPlayerItem to nil when observer does not complete观察者未完成时如何将 AVPlayerItem 设置为 nil
【发布时间】:2016-03-09 00:27:36
【问题描述】:

我在 AVPlayerItem 中添加了一个名为“status”的observer。 发送观察者,然后在观察者未完成时将 AVPlayerItem 设置为 nil

dealloc AVPlayerItem 时我已经移除了观察者

得到以下错误:

NSInternalInconsistencyException',原因:'一个实例 0x7dc5e7d0 类 AVPlayerItem 被释放,而键值观察者被释放 仍然注册它。当前观察信息: (上下文:0x0,属性:0x7b8ad140>

【问题讨论】:

    标签: ios swift avplayer avplayeritem


    【解决方案1】:

    我不相信AVPlayerItem 应该观察任何东西,如果没有具体的例子,很难说你的情况。通常,您的控制器是来自AVPlayerItem的一些通知的观察者。

    例如:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(movieItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:nil];
    

    然后当你完成后(即当你将 AVPlayerItem 设置为 nil 时),你移除观察者:

    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
    

    如果您提供更多详细信息,也许我可以提供更多帮助。谢谢!

    编辑:

    很快就会……

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "movieDidReachEnd", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
    
        NSNotificationCenter.defaultCenter().removeObserver(self, name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
    

    【讨论】:

    • 我想观察'ReadyToPlay'状态,通知好像不支持
    • 我在 AVPlayerItem 中面临同样的问题。
    【解决方案2】:

    在将 playerItem 设置为 nil 之前,移除观察者:

    playerItem.removeObserver(self, forKeyPath: "status")
    

    如果你等到 deinit/dealloc,在你已经将 playerItem 设置为 nil 之后,你将不再引用它来删除观察者。

    【讨论】:

    • 我已经在解除分配 AVPlayerItem 之前删除了观察者,但我得到了由 AVPlayerItem is dealloc 引起的错误
    • 你能把删除观察者的代码贴出来吗?
    【解决方案3】:

    它通过异步导致初始 avplayitem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2012-10-18
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多