从 AVPlayer 中删除观察者时,应用程序有时会崩溃
App crashes sometimes when removing observer from AVPlayer
我正在开发类似于 TikTok App 的东西,所以我在 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,任何想法都可能有所帮助。
谢谢。
你可以处理: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
我正在开发类似于 TikTok App 的东西,所以我在 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,任何想法都可能有所帮助。
谢谢。
你可以处理: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