我正在尝试制作一个可以使用AVPlayer
和AVPlayerItem
播放多个视频的表格视图,我需要将addObserver添加到每个AVPlayerItem
,以便我可以跟踪playbackLikelyToKeepUp属性
我尝试和失败的是在设置AVPlayerItem
并在deinit
的{{1}}中删除它后添加观察者,但由于单元格从未被释放但是已经出列,所以这赢得了#39;工作,我会得到这个错误
UITableViewCell
搜索后我想出了这个
An instance 0x14eedebc0 of class AVPlayerItem was
deallocated while key value observers were still registered with it.
上添加或删除观察者,但我必须这样做,因为播放器项目是在单元格子类中生成的UITableViewCell
并删除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
如果有人知道如何实现这一点,我会很高兴知道吗?感谢
答案 0 :(得分:3)
因此,对我有用的最佳解决方案是继承AVPlayerItem
并使用协议委托回任何符合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()
}
}
}
答案 1 :(得分:0)
尝试覆盖&#39; prepareForReuse&#39;在UITableViewCell子类中运行,并删除该位置的观察者。
override func prepareForReuse() {
super.prepareForReuse()
//remove observer here...
}