我正在尝试下载和播放像Instagram,藤甚至Facebook这样的tableView中的视频。
我想要实现的是一个tableView,我在其中显示视频,并在滚动时自动下载和播放。喜欢Instagram ...
到目前为止,我已经管理了大部分内容,但我想改变的是,每次我查看一个单元格时,视频会一次又一次地下载....当然必须有一种方法来缓存视频,或者只下载一次相同的视频....就像使用SDWebImages获取图像一样。
此时,每当我查看单元格时,它都会下载,滚动很糟糕,你可以想象。
现在我似乎无法弄清楚Instagram是如何做到的,但我100%确定他们不会多次下载同一个视频!!
如果有人有,建议或想法,我很乐意听到他们!
非常感谢提前。
答案 0 :(得分:7)
使用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
}
}
答案 1 :(得分:-1)
https://github.com/onevcat/Kingfisher https://github.com/Haneke/HanekeSwift 还有一个很好的库列表,您可能会觉得有用... https://github.com/Wolg/awesome-swift
希望这有帮助!