【发布时间】:2016-11-19 21:16:28
【问题描述】:
任何人都可以帮助创建一个AVPlayer 的池以在 tableView 中重用吗?所以这个想法是拥有一个AVPlayer 的池,比如说3,并在用户滚动表格时继续重用它们。
以下是应用程序的简要概要以及我们想要构建的内容:
- 每个视频都是 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()
}
}
【问题讨论】:
-
嗨,JEL,你最后有没有完美的解决方案。我正在和你做同样的代码并且和你一样陷入同样的问题。你能帮帮我吗,非常感谢
标签: ios swift avfoundation avplayer avplayerlayer