我正在尝试在tableView之类的Instagram,vine甚至Facebook中下载和播放视频。
我想要实现的是一个tableView,在其中显示视频,它们会在滚动时自动下载和播放。像Instagram …
到目前为止,我已经完成了大部分工作,但是我想更改的事实是,每次查看单元格时,视频都会一次又一次下载....当然,必须有一种缓存视频或仅下载视频的方法相同的视频一次。…就像对SDWebImages进行图像处理一样。
同样,每当我查看单元格时,它就会下载,滚动就像您可以想象的那样可怕。
现在我似乎无法弄清楚Instagram是如何做到的,但是我100%确信他们不会多次下载同一视频!
如果有人有意见和建议,我很想听听他们!
提前谢谢了。
使用Haneke,我无法检索缓存视频的文件路径。我通过将视频保存在缓存的目录中来处理它。
public enum Result<T> { case success(T) case failure(NSError) } class CacheManager { static let shared = CacheManager() private let fileManager = FileManager.default private lazy var mainDirectoryUrl: URL = { let documentsUrl = self.fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first! return documentsUrl }() func getFileWith(stringUrl: String, completionHandler: @escaping (Result<URL>) -> Void ) { let file = directoryFor(stringUrl: stringUrl) //return file path if already exists in cache directory guard !fileManager.fileExists(atPath: file.path) else { completionHandler(Result.success(file)) return } DispatchQueue.global().async { if let videoData = NSData(contentsOf: URL(string: stringUrl)!) { videoData.write(to: file, atomically: true) DispatchQueue.main.async { completionHandler(Result.success(file)) } } else { DispatchQueue.main.async { completionHandler(Result.failure(NSError.errorWith(text: "Can't download video"))) } } } } private func directoryFor(stringUrl: String) -> URL { let fileURL = URL(string: stringUrl)!.lastPathComponent let file = self.mainDirectoryUrl.appendingPathComponent(fileURL) return file } }
该类的示例用法如下所示:
CacheManager.shared.getFileWith(stringUrl: "http://techslides.com/demos/sample-videos/small.mp4") { result in switch result { case .success(let url): // do some magic with path to saved video case .failure(let error): // handle errror } }