从UITableViewCell上的多个AVPlayerItem中添加和删除观察者
我试图做一个表视图播放多个videoAVPlayer
和AVPlayerItem
,我需要addObserver到每个AVPlayerItem
所以我可以跟踪playbackLikelyToKeepUp属性
我试过和失败的是在设置AVPlayerItem
之后添加观察者,并在UITableViewCell
的deinit
中删除它,但由于单元格永远不会被释放,但得到出列所以这将无法正常工作,我会得到这个错误
An instance 0x14eedebc0 of class AVPlayerItem was deallocated while key value observers were still registered with it.
search后,我想出了这个
- 我不应该在
UITableViewCell
上添加或删除观察者,但我必须因为播放器项目是在单元格子类 - 处理观察者的最好方法是在'UITableViewDelegate'方法中
- 在
willDisplayCell
添加并在willDisplayCell
移除
但即使这不起作用,因为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.'
如果有人知道如何做到这一点,我会很高兴知道? 谢谢
所以对我来说最好的解决scheme就是对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() } } }
尝试在您的UITableViewCell子类中重写“prepareForReuse”函数,并在该位置删除观察者。
override func prepareForReuse() { super.prepareForReuse() //remove observer here... }