2017-01-09 16 views
1

Instagram、vine、facebookのようなテーブルビューでビデオをダウンロードして再生しようとしています。動画をキャッシュすることはできますか? IOS - Swift

私が達成しようとしているのは、ビデオを表示し、スクロール中に自動的にダウンロードして再生するtableViewです。 Instagramのように...

これまでほとんどのことを管理していましたが、私が変更したいのは、私がセルを見るたびにビデオが何度もダウンロードされるという事実です。ビデオをキャッシュする方法、または同じビデオを一度だけダウンロードする方法.... SDWebImagesでイメージを処理するのと同じように。

また、私がセルを見るたびにダウンロードする瞬間、あなたが想像できるようにスクロールがひどいです。

Instagramの仕組みはわかりませんが、同じビデオを2度以上ダウンロードしないことを100%確信しています!

誰でもアドバイスやアイデアがあれば、私はそれらを聞いてみたい!

事前に感謝します。

+0

..あなたはそれをどのように行うのですか? –

答えて

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 
    } 
} 

使用例は次のようになります。私はそれらをスクロールし、キャッシュながら映像を表示まったく同じのfunctionnalities ...が必要

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 
     } 
    } 
関連する問題