【问题标题】:App crashes sometimes when removing observer from AVPlayer从 AVPlayer 移除观察者时,应用程序有时会崩溃
【发布时间】:2019-12-21 13:33:11
【问题描述】:

我正在开发类似于 TikTok 应用程序的东西,所以我在 scrollView 中有一个 ScrollView 和多个自定义 UIView,在 viewDidLoad 上,我正在初始化所有必需的视图以准备视频。

每个视图都有自己的 AVPlayer 和自己的观察者,如下所示:

playerItem?.addObserver(self, forKeyPath: "status", options: [.old, .new], context: safeAudioItemPointer)
player?.addObserver(self, forKeyPath: "timeControlStatus", options: [.old, .new], context: safeAudioPlayerPointer)

所以当用户想要离开控制器时,我只需以这种方式删除每个视图的观察者:

if let playerItem = self.playerItem, let asset = self.asset, let player = self.player {

        asset.cancelLoading()
        playerItem.cancelPendingSeeks()

        if playerItem.observationInfo != nil {
            playerItem.removeObserver(self, forKeyPath: "status", context: self.safeAudioItemPointer)
        }

        if player.observationInfo != nil {
            player.removeObserver(self, forKeyPath: "timeControlStatus", context: self.safeAudioPlayerPointer)
        }

        player.cancelPendingPrerolls()
        player.replaceCurrentItem(with: nil)

        stop()
    }

我的问题是有时“timeControlStatus”观察者没有注册,所以应用程序崩溃了,我没有找到检查观察者是否已经注册的方法。

另外,我不能依赖 deinit() 覆盖方法,因为有时我需要在不关闭控制器的情况下移除观察者。

我正在开发 Swift 3,任何想法都会有所帮助。

谢谢。

【问题讨论】:

  • 在添加观察之前检查playerplayerItem。某些对象可以为零。您还可以添加订阅状态,以便以后尝试在某处取消订阅时使用。

标签: ios swift avplayer avplayeritem


【解决方案1】:

你可以处理:NSKeyValueObservation

var observer: NSKeyValueObservation?

self.observer = myPlayer.observe(\.rate, options:  [.new, .old], changeHandler: { (player, change) in
     if player.rate == 1  {
          print("Playing")
      }else{
           print("Stop")
      }
 })

 // Later You Can Remove Observer      
 self.observer?.invalidate()
 self.observer = nil

【讨论】:

  • 何时移除观察者?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多