gpt4 book ai didi

ios - 从 AVPlayer 移除观察者时,应用程序有时会崩溃

转载 作者:行者123 更新时间:2023-12-01 18:35:50 39 4
gpt4 key购买 nike

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

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

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

因此,当用户想要离开 Controller 时,我只需以这种方式删除每个 View 的观察者:
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() 覆盖方法,因为有时我需要在不关闭 Controller 的情况下移除观察者。

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

谢谢。

最佳答案

您可以处理: NSKeyValue 观察

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

关于ios - 从 AVPlayer 移除观察者时,应用程序有时会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436602/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com