2017-01-09 6 views
1

Ich versuche, Videos in einem TableView wie Instagram, Wein oder sogar Facebook zu downloaden und abzuspielen.Ist es möglich, Videos zu cachen? IOS - Swift

Was ich versuche zu erreichen, ist ein TableView, wo ich die Videos anzeigen und sie automatisch herunterladen und beim Scrollen spielen. Wie Instagram ...

Bislang habe ich das meiste geschafft, aber was ich gerne ändern würde, ist die Tatsache, dass jedes Mal, wenn ich eine Zelle anschaue, das Video immer wieder heruntergeladen wird ... Sicher muss es sein eine Möglichkeit, Videos zwischenzuspeichern oder das gleiche Video nur einmal herunterzuladen .... Wie bei SDWebImages für Bilder.

Auch im Moment mit dem Download jedes Mal, wenn ich die Zelle sehe, ist das Scrollen schrecklich, wie Sie sich vorstellen können.

Jetzt kann ich nicht herausfinden, wie Instagram es tut, aber ich bin 100% sicher, dass sie nicht das gleiche Video mehr als einmal herunterladen !!

Wenn jemand hat und Tipps oder Ideen, würde ich gerne hören sie !!

Vielen Dank im Voraus.

+0

Ich brauche genau die gleichen functionnalities ... Videos Anzeige beim Scrollen und ihnen das Caching .. wie hast du das gemacht? –

Antwort

0

große Frage. Du solltest am besten etwas Open-Source und Drittanbieter auf Github verwenden. Ich benutze sie ausschließlich für Bilder, aber ich glaube, sie werden auch Videos für Sie laden und zwischenspeichern. Hier sind die Links zu einigen populären ...

https://github.com/onevcat/Kingfisher https://github.com/Haneke/HanekeSwift Es gibt auch eine gute Liste der Bibliotheken, die Sie nützlich finden könnten ... https://github.com/Wolg/awesome-swift

hoffe, das hilft!

+0

Vielen Dank für Ihre Antwort. Ich werde dir Bibliotheken anschauen, hoffentlich werde ich sie nützlich finden! – Charles

+0

@Charles hast du etwas gegründet? –

+0

@VladPulichev Haben Sie etwas gefunden? –

2

Mit Haneke konnte ich den Dateipfad für zwischengespeichertes Video nicht abrufen. Ich habe es gehandhabt, indem ich Video im zwischengespeicherten Verzeichnis speicherte.

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

Verwendungsbeispiel dieser Klasse sieht wie folgt aus:

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