gpt4 book ai didi

ios - 在 UITableViewCell 的多个 AVPlayerItem 中添加和删除观察者

转载 作者:搜寻专家 更新时间:2023-11-01 06:40:08 25 4
gpt4 key购买 nike

我正在尝试制作一个表格 View ,用 AVPlayerAVPlayerItem 播放多个视频,我需要为每个 AVPlayerItem 添加 Observer,所以我可以跟踪 playbackLikelyToKeepUp 属性

我尝试但失败的是在设置 AVPlayerItem 并在 UITableViewCelldeinit 中删除它之后添加观察者,但是由于单元格永远不会被释放,但会被出队,所以这行不通,我会得到这个错误

An instance 0x14eedebc0 of class AVPlayerItem was 
deallocated while key value observers were still registered with it.

经过搜索我想到了这个

  • 我不应该在 UITableViewCell 上添加或删除观察者,但我不得不这样做,因为播放器项目是在单元格子类中制作的
  • 处理观察者的最佳方式是在“UITableViewDelegate”方法中
  • willDisplayCell 中添加并在 didEndDisplayingCell 中删除

但即使这样在我的情况下也不起作用,因为 AVPlayerItem 需要时间来初始化

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
cell.setUpPLayer()
return cell
}

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let cell = cell as! TableViewCell
if cell.Player == nil {
self.addObserversToCell(cell)
}
}

override func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let cell = cell as! TableViewCell
self.removeMyObserversFromCell(cell)
}

所以观察者不会被添加到 willDisplayCell 但移除观察者将被调用并导致运行时错误

'Cannot remove an observer <AVFPlayer.TableViewCell 0x13cf1e9b0> for
the key path "playbackLikelyToKeepUp"
<AVPlayerItem0x13cf31860> because it is not registered as an observer.'

如果有人知道如何实现这一点,我很乐意知道?谢谢

最佳答案

所以对我来说最好的解决方案是子类化 AVPlayerItem 并使用协议(protocol)委托(delegate)回任何符合 AMPlayerItemDelegate 的类

我是这样做的

protocol AMPlayerItemDelegate {
func playbackLikelyToKeepUp()
}

class AMPlayerItem: AVPlayerItem {

var delegate : MyPlayerItemDelegate?

init(URL: NSURL) {
super.init(asset: AVAsset(URL: URL) , automaticallyLoadedAssetKeys:[])
self.addMyObservers()
}

deinit {
self.removeMyObservers()
}

func addMyObservers() {
print("Adding")
self.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: [.New], context: nil)
}

func removeMyObservers() {
print("Removing")
self.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp", context: nil)
}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "playbackLikelyToKeepUp" {
self.delegate?.playbackLikelyToKeepUp()
}
}

}

关于ios - 在 UITableViewCell 的多个 AVPlayerItem 中添加和删除观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632104/

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