当前位置:  开发笔记 > IOS > 正文

是否可以缓存视频?IOS - 斯威夫特

如何解决《是否可以缓存视频?IOS-斯威夫特》经验,为你挑选了1个好方法。

我想在Instagram,藤蔓甚至Facebook这样的tableView中下载和播放视频.

我想要实现的是一个tableView,我在其中显示视频,并在滚动时自动下载和播放.喜欢Instagram ...

到目前为止,我已经管理了大部分内容,但我想改变的是,每次我查看一个单元格时,视频会一次又一次地下载....当然必须有一种方法来缓存视频,或者只下载相同的视频一次....就像你使用SDWebImages进行图像一样.

此外,每当我查看单元格时,它都会下载,滚动很糟糕,你可以想象.

现在我似乎无法弄清楚Instagram是如何做到的,但我100%确定他们不会多次下载同一个视频!

如果有人有建议或想法,我很乐意听到他们!

提前谢谢了.



1> mkkrolik..:

使用Haneke,我无法检索缓存视频的文件路径.我通过在缓存目录中保存视频来处理它.

public enum Result {
    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) -> 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
        }
    }

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有