2017-01-09 62 views
1

我正嘗試下載和播放InstagramView,Vine甚至Facebook等tableView中的視頻。是否可以緩存視頻? IOS - Swift

我想要實現的是一個tableView,我在其中顯示視頻並自動下載並在滾動時播放。像Instagram的...

到目前爲止,我已經管理了大部分,但我想改變的事實是,每次我查看一個單元格的視頻一次又一次地下載......當然,必須有一種緩存視頻的方法,或者只下載一次相同的視頻....就像使用SDWebImages處理圖像一樣。

同樣在每次查看單元格時下載的時刻,滾動都很糟糕,正如您可以想象的那樣。

現在我似乎無法弄清楚Instagram是怎麼做的,但我100%肯定他們不會多次下載同一個視頻!

如果有人有任何建議或意見,我很樂意聽到他們!

非常感謝提前。

+0

我需要完全一樣functionnalities ...顯示視頻,同時滾動和緩存他們..你是怎麼做到的呢? –

回答

0

很好的問題。你最好的選擇是在Github上使用開源和第三方。我僅將它們用於圖像,但我相信它們也會爲您加載和緩存視頻。下面是鏈接到一些流行的...

https://github.com/onevcat/Kingfisher https://github.com/Haneke/HanekeSwift 還有你可能會發現有用的庫的一個很好的列表... https://github.com/Wolg/awesome-swift

希望這有助於!

+0

非常感謝你的回答。我會看看你的圖書館,希望我會發現它們有用! – Charles

+0

@Charles你創立了什麼? –

+0

@VladPulichev你有什麼發現? –

2

使用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 
     } 
    } 
相關問題