2016-11-19 56 views
1

任何人都可以幫助創建一個AVPlayer的池在tableView中重用嗎?因此,想法是讓AVPlayer的池,比方說3,並在用戶滾動瀏覽表格時繼續重用它們。在TableView中重複使用AVPlayer

這裏的應用程序的快速大綱,我們要建設什麼樣的:

  • 每個視頻是MP4,是隻有5秒之久。所以每個小區都會播放5秒的視頻並循環播放。
  • 所有視頻都是本地的,它們會在表格顯示給用戶之前下載到磁盤。這將有助於tableView的平滑滾動性能。

現在我創造了太多AVPlayer的,而不是重複使用它們這是對性能產生不良影響,如滾動有點不穩定。另外,Apple不允許創建無限量的AVPlayer

任何想法?由於

更新1:

import UIKit 
import VIMVideoPlayer 

var cache = NSCache<NSString, VIMVideoPlayerView>() 

class FeedTableViewCell: UITableViewCell { 
// MARK: - Properties 

@IBOutlet weak var containerView: UIView! 

static let reuseIdentifier = "FeedTableViewCell" 

var video: Video? { 
    didSet { 
     if let cachedVideoPlayerView = cache.object(forKey: video!.preview!.remoteURL as NSString) { 
      // We have a cached video player view! 
      containerView.addSubview(cachedVideoPlayerView) 
     } else { 
      // There is nothing cached. 
      let previewURL = FileManager.applicationDocumentsDirectory.appendingPathComponent(video!.preview!.fileName!) 
      let newVideoPlayer = VIMVideoPlayer() 
      newVideoPlayer.setURL(previewURL) 
      newVideoPlayer.isLooping = true 
      newVideoPlayer.isMuted = true 
      newVideoPlayer.disableAirplay() 

      let newVideoPlayerView = VIMVideoPlayerView() 
      newVideoPlayerView.frame = contentView.bounds 
      newVideoPlayerView.delegate = self 
      newVideoPlayerView.setVideoFillMode(AVLayerVideoGravityResizeAspectFill) 
      newVideoPlayerView.player = newVideoPlayer 
      containerView.addSubview(newVideoPlayerView) 
      cache.setObject(newVideoPlayerView, forKey: video!.preview!.remoteURL as NSString) 
     } 
    } 
} 

// MARK: - Life Cycle 

override func awakeFromNib() { 
    super.awakeFromNib() 

    print("AWAKE FROM NIB CELL") 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 

} 
} 

// MARK: - VIMVideoPlayerViewDelegate 
extension FeedTableViewCell: VIMVideoPlayerViewDelegate { 
func videoPlayerViewIsReady(toPlayVideo videoPlayerView: VIMVideoPlayerView!) { 
    videoPlayerView.player.play() 
} 
} 
+0

[AVPlayer.play()在UITableViewCell中可能的重複會暫時阻止UI](http://stackoverflow.com/questions/35496766/avplayer-play-in-uitableviewcell-briefly-blocks-ui) –

回答

0

擴展您的使用池,而不是另起爐竈的想法,爲什麼不利用UITableViewCell的當前實現可重用性?在任何時候,存在n'可重用'UITableViewCell,充當您的游泳池。

如果這些單元格中的每一個單元格都包含一個AVPlayer子視圖,則表格視圖將爲您完成管理。因此,在UITableViewCell的重用標識符中,停止播放器(如果需要),更新其MP4(從內存緩存中理想地更新),然後再次啓動它。

如果需要,您可以在單元格消失時緩存視頻的位置,以使其看起來像在滾動過程中視頻從不停止播放。

- 作爲一個方面說明,理論上這可以工作,但尚未經過現場應用測試。顯而易見的警告是在主線程上加載到AVPlayer視頻的大小,同時嘗試維持60fps。

編輯:

請參閱https://stackoverflow.com/a/35514126/556479獲取更多信息。

+0

請參閱我的更新用一些代碼。看起來,通過你的回答,tableView已經創建了一定數量的'AVPlayer',我需要做的是通過用新項目替換當前項目來重用它們 - 這是正確的嗎?另外,在我目前的代碼中,我似乎沒有這樣做,我正在做的是多次創建一個新玩家。 – JEL

+0

順便說一句,'VIMVideoPlayerView'只是一個圍繞'AVPlayer'的包裝,它是Vimeo的一個庫。 – JEL

+0

@JEL確切地說,不是爲每個單元創建一個新的VIMVideoPlayerView,而是在每個單元中實例化一次,並告訴視圖在「prepareForReuse」函數中停止。 –