Wie cache-Bilder mit URLSession in Swift
Ich würde gerne verbessern Sie den code unten, um die cache-Bilder nur herunterladen, wenn Sie noch nicht zwischengespeichert wurde, zuvor. Ich kann nicht scheinen zu finden, eine gute Beispiele, wie URLSession Objekt, dies zu tun.
extension UIImageView {
func loadImageWithURL(_ url: URL) -> URLSessionDownloadTask {
let session = URLSession.shared
let downloadTask = session.downloadTask(with: url, completionHandler: { [weak self] url, response, error in
if error == nil, let url = url,
let data = try? Data(contentsOf: url), let image = UIImage(data: data) {
DispatchQueue.main.async {
if let strongSelf = self {
strongSelf.image = image
}
}
}
})
downloadTask.resume()
return downloadTask
}
}
- nshipster.com/nsurlcache
- Nicht verwandt, Ihre
if let strongSelf = self { strongSelf.image = image }
kann vereinfacht werden zuself?.image = image
. - FWIW,
NSURLCache
wird der cache nach dem, was geliefert wird, in die Header der server-Antwort. Es ist auch einschränken cache entsprechend schlecht dokumentiert Regeln, vor allem, wenn ein download mehr als 5% des Gesamt-cache, es wird nicht zwischengespeichert werden, unabhängig davon, was der server die Header sagen (dies ist ein Grund für die Beule, die cache-Größe als die in dem link von Leo zur Verfügung gestellt).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktualisiert Swift 4
Verwendung:
Eine mögliche Lösung wäre, zu nutzen
NSCache
zu kümmern Zwischenspeichern. Im wesentlichen, was Sie tun würde, ist zu überprüfen, wenn Sie bereits das Bild lokal laden, anstatt das abrufen jedes mal, bevor Sie tatsächlich einen Antrag stellen.Hier ist einer meiner Implementierungen, jedoch - es ist eine Unterklasse eher als eine Erweiterung:
Außerdem, hier ist eine nützliche Ressource:
https://www.hackingwithswift.com/example-code/system/how-to-cache-data-using-nscache