从UITableViewCell上的多个AVPlayerItem中添加和删除观察者

我试图做一个表视图播放多个videoAVPlayerAVPlayerItem ,我需要addObserver到每个AVPlayerItem所以我可以跟踪playbackLikelyToKeepUp属性

我试过和失败的是在设置AVPlayerItem之后添加观察者,并在UITableViewCelldeinit中删除它,但由于单元格永远不会被释放,但得到出列所以这将无法正常工作,我会得到这个错误

 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... }