SDWebImage ist eine Bibliothek für asynchrones Laden von Bildern auf iOS und macOS, die eine einheitliche API für die Arbeit mit Netzwerk, Cache und Animationen bietet. Laut offiziellem Repository wird die Bibliothek in mehr als 100.000 Projekten eingesetzt und unterstützt GIF, WebP, SVG und progressives Laden. SDWebImage bietet automatisches Caching auf Festplatte und im Arbeitsspeicher sowie Integration mit UIKit und SwiftUI.
Wichtige Punkte
SDWebImage ist eine Bibliothek für asynchrones Laden von Bildern auf Apple-Plattformen (iOS, macOS, tvOS, watchOS). Sie stellt eine Kategorie für UIImageView mit der Methode sd_setImage bereit, die mit einer Zeile Code ein Bild aus jeder Quelle lädt, cached und anzeigt.
Die Bibliothek unterstützt progressives Laden (das Bild erscheint während des Byte-Empfangs), animierte Bilder (GIF, APNG), Transformationen (Abrunden, Zuschneiden, Wasserzeichen) und benutzerdefinierte Decoder. Laut GitHub Stats hat SDWebImage über 25.000 Sterne und wird in großen Anwendungen wie Twitter, Pinterest und Instagram eingesetzt.
Die Architektur basiert auf einer Komponentenkette: Coder (Dekodierung), Cache (Speicher), Loader (Netzwerk) und Transformer (Verarbeitung). Jede Komponente ist austauschbar, sodass die Bibliothek an spezifische Projektanforderungen angepasst werden kann.
SDWebImageManager ist die zentrale Komponente, die den Ladevorgang koordiniert. Er nimmt eine URL entgegen, prüft den Cache, lädt die Daten, dekodiert sie in ein UIImage und übergibt sie an ImageView oder Completion Handler. Der Manager arbeitet über ein gemeinsames Singleton, das von überall in der Anwendung zugänglich ist.
Der Manager prüft nacheinander den Memory Cache (NSDictionary mit UIImage), dann den Disk Cache (Dateisystem). Bei einem Fehlschlag wird eine Netzwerkanfrage über NSURLSession gestellt. Nach dem Laden werden die Daten dekodiert, durchlaufen Transformationen und werden in beiden Caches gespeichert. Der gesamte Prozess läuft in einer Hintergrundwarteschlange, die Ergebnisse werden in der Hauptwarteschlange zugestellt.
UIImageView+WebCache ist eine Objective-C-Kategorie (von Swift zugänglich), die die Methode sd_setImage hinzufügt. Diese Methode nimmt eine URL, einen Platzhalter, Optionen (SDWebImageOptions) und einen Completion-Block entgegen. Die Kategorie bricht die vorherige Anfrage automatisch ab, wenn eine Tabellenzelle über den sd_cancelCurrentImageLoad-Mechanismus wiederverwendet wird.
Die SDWebImage-Architektur ist in mehrere Module mit klaren Verantwortungsbereichen unterteilt. Jede Klasse löst eine Aufgabe — vom Laden bis zur Anzeige.
SDWebImageManager ist die Fassade für alle Bildoperationen. Er enthält Referenzen auf ImageCache (SDImageCache) und ImageLoader (SDWebImageDownloader). Über den Delegaten SDWebImageManagerDelegate kann der Ladevorgang abgefangen und die URL oder das Verhalten geändert werden.
SDImageCache ist ein zweistufiger Cache (Speicher + Festplatte), der mit einem eindeutigen Namespace initialisiert wird. Der Memory Cache speichert UIImage mit einem konfigurierbaren Limit (standardmäßig bis zur System-Speicherwarnung). Der Disk Cache speichert Daten im Verzeichnis Library/Caches mit einer konfigurierbaren Aufbewahrungsdauer (Standard 7 Tage).
SDWebImageDownloader ist ein HTTP-Client basierend auf NSURLSession mit Unterstützung für Header, Timeouts und Wiederholungsversuche. Der Downloader dedupliziert identische Anfragen in einem einzigen Netzwerkaufruf und verteilt das Ergebnis an alle Abonnenten.
SDWebImage implementiert zweistufiges Caching mit einer deterministischen Prüfreihenfolge: zuerst Speicher, dann Festplatte. Der Cache-Schlüssel ist die absolute Bild-URL ohne Abfrageparameter oder ihr MD5-Hash.
| Ebene | Speichertyp | Inhalt | Limit |
|---|---|---|---|
| Memory Cache | NSCache (NSDictionary) | UIImage (dekodierte Bitmap) | Bis Speicherwarnung |
| Disk Cache | Dateisystem | NSData (JPEG/PNG/WebP) | 7 Tage TTL (konfigurierbar) |
| Auto Purge Cache | Speicher + Festplatte | Kombinierter Framework-Cache | Konfigurierbare Dateigröße |
Beim Empfang einer Speicherwarnung benachrichtigt iOS SDImageCache über UIApplicationDidReceiveMemoryWarningNotification, woraufhin der Memory Cache vollständig geleert wird. Der Disk Cache wird nach TTL oder bei Überschreitung des Limits geleert, wobei die Dateien nach dem Datum des letzten Zugriffs sortiert werden.
Für die manuelle Cache-Verwaltung stehen folgende Methoden zur Verfügung: clearMemory, clearDisk, calculateSize. Das Caching kann für bestimmte Anfragen über die Optionen SDWebImageCacheMemoryOnly oder SDWebImageAvoidAutoSetImage deaktiviert werden.
SDWebImage bietet mehrere Schnittstellen zum Laden von Bildern: von der einfachen UIImageView-Kategorie bis zum erweiterten Manager mit benutzerdefinierter Verarbeitung.
sd_setImage ist die primäre Methode zum Laden eines Bildes in UIImageView. Sie nimmt eine URL, einen Platzhalter und optionale Parameter über Options und Context entgegen. Alle Completion Handler werden im Hauptthread ausgeführt.
let imageView = UIImageView()
imageView.sd_setImage(
with: URL(string: "https://example.com/photo.jpg"),
placeholderImage: UIImage(named: "placeholder"),
options: [.progressiveLoad, .retryFailed],
context: [.imageThumbnailPixelSize : CGSize(width: 300, height: 300)]
)
Die Methode gibt ein SDWebImageToken (Operation) zurück, das bei Bedarf abgebrochen werden kann. Intern ruft sd_setImage SDWebImageManager.load auf und übergibt ImageView als Target für die automatische Bildeinstellung.
SDWebImage unterstützt Transformer — ein Protokoll mit einer einzigen Methode transformedImage. Integrierte Transformationen umfassen: Kreis, abgerundete Ecken, Farbfilter-Überlagerung und Größenänderung. Transformationen können mit dem &&-Operator kombiniert werden.
let transformer = SDImageResizingTransformer(
size: CGSize(width: 200, height: 200),
scaleMode: .aspectFill
)
let roundedTransformer = SDImageRoundCornerTransformer(
radius: 16,
corners: .allCorners,
borderWidth: 0
)
imageView.sd_setImage(
with: url,
placeholderImage: placeholder,
context: [.imageTransformer : transformer && roundedTransformer]
)
Die Bibliothek bietet WebImage — eine View-Komponente für SwiftUI mit Unterstützung für Platzhalter, Fortschrittsanzeige und Fehlerbehandlung. Die Komponente abonniert automatisch den Lebenszyklus der View und bricht das Laden ab, wenn sie verschwindet.
struct CachedImageView: View {
let url: URL
var body: some View {
WebImage(url: url) { phase in
if let image = phase.image {
image.resizable()
} else if phase.error {
Color.red
} else {
ProgressView()
}
}
}
}
SDWebImage bietet ein flexibles Transformationssystem über das SDImageTransformer-Protokoll. Transformationen werden nach der Dekodierung, aber vor dem Caching angewendet — das Transformationsergebnis wird unter einem neuen Schlüssel auf der Festplatte gespeichert, um eine erneute Anwendung bei nachfolgenden Anfragen zu vermeiden.
Integrierte Transformationen umfassen: SDImageResizingTransformer (Größenänderung mit Modus), SDImageRoundCornerTransformer (abgerundete Ecken mit optionalem Rand), SDImageFlipTransformer (Spiegelung) und SDImageFilterTransformer (CoreImage-Filter). Die Kombination erfolgt über den &&-Operator, der eine Verarbeitungskette erstellt.
Für benutzerdefinierte Transformationen reicht es aus, das SDImageTransformer-Protokoll mit der Methode transformedImageWithImage:forKey: zu implementieren. Der Transformationsschlüssel wird automatisch zum Cache-Schlüssel hinzugefügt, um Kollisionen zwischen verschiedenen Versionen desselben Bildes zu vermeiden.
Auf der iOS-Plattform sind die Hauptkonkurrenten von SDWebImage Kingfisher (reines Swift) und Nuke. Die Wahl zwischen SDWebImage und Kingfisher wird oft durch die Projektsprache und die erforderliche Funktionalität bestimmt.
| Merkmal | SDWebImage | Kingfisher |
|---|---|---|
| Sprache | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Ja (integriert) | Ja (integriert) |
| WebP | Ja (Plugin) | Ja (integriert) |
| Progressives Laden | Ja (mit Plugin) | Ja |
| Framework-Größe | ~1.2 MB | ~900 KB |
| Cache | Speicher + Festplatte | Speicher + Festplatte |
| CocoaPods-Unterstützung | Ja | Ja |
SDWebImage bleibt die bevorzugte Wahl für Objective-C-Projekte oder Hybridprojekte. Kingfisher eignet sich besser für reine Swift-Projekte dank Typsicherheit und nativer Swift-Syntax. Beide Bibliotheken haben eine ähnliche Caching-Architektur und Leistung.
SDWebImage kann über Swift Package Manager, CocoaPods oder Carthage integriert werden. Die Bibliothek ist in Module unterteilt: Kern (SDWebImage), Coder (zusätzliche Formate) und MapKit (für MKAnnotationView).
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/SDWebImage/SDWebImage.git",
from: "5.19.0"
)
]
// CocoaPods (Podfile)
pod 'SDWebImage', '~> 5.19.0'
// Plugins für WebP und SVG:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
Nach der Installation ist die Bibliothek ohne zusätzliche Konfiguration einsatzbereit. Für die Cache-Anpassung erstellen Sie eine Instanz von SDImageCache mit einem eindeutigen Namespace und übergeben sie an SDWebImageManager bei der Initialisierung. Die globale Konfiguration erfolgt über SDWebImageManager.shared.
// Cache-Anpassung
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 14 Tage statt 7
config.maxDiskSize = 500 * 1024 * 1024 // 500 MB
config.shouldCacheImagesInMemory = .true
let cache = SDImageCache(
namespace: "custom",
diskCacheDirectory: FileManager.default.urls(
for: .cachesDirectory,
in: .userDomainMask
).first?.appendingPathComponent("custom_cache"),
config: config
)
SDWebImageManager.sharedImageCache = cache
Häufig gestellte Fragen
SDWebImage ist eine Bibliothek für asynchrones Laden von Bildern auf iOS und macOS. Sie löst die Probleme des Cachings, Dekodierens, Transformierens und Anzeigens von Bildern aus dem Netzwerk und befreit den Entwickler von der manuellen Thread- und Speicherverwaltung.
Verwenden Sie in der cellForRowAt-Methode sd_setImage mit einer URL und einem Platzhalter. Die Bibliothek bricht die vorherige Anfrage automatisch ab, wenn die Zelle wiederverwendet wird. Für flüssiges Scrollen geben Sie die Option .progressiveLoad an und konfigurieren Sie die Thumbnail-Größe über den Kontext.
SDWebImage ist in Objective-C mit einem Swift-Wrapper geschrieben, während Kingfisher in reinem Swift geschrieben ist. SDWebImage hat ein größeres Plugin-Ökosystem (WebP, SVG, MapKit). Kingfisher bietet bessere Typsicherheit und Integration mit Swift Concurrency.
Installieren Sie das Plugin SDWebImageWebPCoder über CocoaPods oder SPM. Registrieren Sie den Coder durch Aufruf von SDImageWebPCoder.shared im AppDelegate. Nach der Registrierung erkennt die Bibliothek automatisch das Format und dekodiert WebP.
Rufen Sie SDImageCache.shared.clearMemory() für den Speicher und SDImageCache.shared.clearDisk() für die Festplatte auf. Um nur veraltete Dateien zu löschen, verwenden Sie clearDisk(completion:) mit TTL-Prüfung. Die Methode calculateSizeWithCompletionBlock gibt die aktuelle Cache-Größe zurück.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch