【问题标题】:Error while adding an observer to a player向玩家添加观察者时出错
【发布时间】:2018-01-10 10:24:35
【问题描述】:

由于未捕获的异常而终止应用 'NSInternalInconsistencyException',原因:'一个实例 0x1702076f0 类 AVPlayerItem 被释放,而键值观察者被释放 仍然注册它。当前观察信息: (

(.)'

这是我在将 currentItem.loadedTimeRanges 观察者添加到我的 AVPlayer 后收到的错误

player = AVPlayer(url: videoUrl!)
        playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = postVideoView.frame
        playerLayer.frame.size.width = UIScreen.main.bounds.width
        self.postVideoView.layer.addSublayer(playerLayer)
        player?.play()
        player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil, using: { (_) in
            DispatchQueue.main.async {
                self.player?.seek(to: kCMTimeZero)
                self.player?.play()
            }
        })
    }


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    //this is when the player is ready and rendering frames
    if keyPath == "currentItem.loadedTimeRanges" {
        if let duration = player?.currentItem?.duration {
            let seconds = CMTimeGetSeconds(duration)

            let secondsText = Int(seconds) % 60
            let minutesText = String(format: "%02d", Int(seconds) / 60)
            videoLengthLabel.text = "\(minutesText):\(secondsText)"
        }
    }
}

【问题讨论】:

    标签: ios swift xcode avplayer


    【解决方案1】:

    你在哪里打电话给removeObserver?目前,您的顶级代码似乎创建了一个新玩家并添加了一个观察者。如果这被调用两次,第一个实例上的观察者仍然存在。因此,我希望在顶部有以下行:

    self.player?.removeObserver(self)
    

    如果它没有被调用两次,代码中是否还有其他地方 self.player 被重新分配或解除分配?如果是这样,您应该首先致电removeObserver

    您每次都会向 NotificationCenter 添加一个新的观察者。这应该只被调用一次或removeObserver 在添加另一个之前。

    【讨论】:

    • 我正在调用表格视图单元格方法。是不是这个问题。否则我怎么能绕过它
    • 很难理解您的代码流程 - 您可能需要在问题中包含更多内容,例如如何调用 player = ...,以及 removeObserver 的代码。
    【解决方案2】:

    您需要确保不会多次添加和删除观察者。所以最好的方法就是声明一个布尔变量让我们说var isObserverAdded = false.

    在添加观察者时检查这个标志,如果没有添加

    if !isObserverAdded {
    //Add your observer
    isObserverAdded = true//Set this to true
    }
    

    移除观察者时检查是否添加了标志

    if isObserverAdded {
    //Add your observer
    isObserverAdded = false//Set this to false
    }
    

    如果使用上述检查,那么您将永远不会收到错误。

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      相关资源
      最近更新 更多