Kingfisher ist eine Bibliothek zum Laden und Caching von Bildern auf iOS, macOS und watchOS, geschrieben in reinem Swift. Laut dem offiziellen Repository bietet die Bibliothek volle Unterstützung für Swift Concurrency, Combine und SwiftUI sowie automatisches zweistufiges Caching. Kingfisher ist bekannt für ihre typsichere API und einfache Integration in Swift-Projekte.
Wichtige Punkte
Kingfisher ist eine Bibliothek für asynchrones Laden und Caching von Bildern auf Apple-Plattformen, vollständig in Swift geschrieben. Der Autor der Bibliothek ist Wei Wang (onevcat). Kingfisher bietet eine Reihe von Werkzeugen zum Laden von Bildern aus dem Netzwerk mit automatischem Caching, Transformationen und Unterstützung für moderne Swift-Technologien: async/await, Combine, Sendable.
Die Bibliothek hat über 23.000 Sterne auf GitHub und wird in Anwendungen wie Telegram, Snapchat und Dropbox verwendet. Kingfisher unterstützt GIF, APNG, HEIF und alle Standardbildformate. Jede Anfrage gibt ein typsicheres Result
Die Architektur von Kingfisher basiert auf drei Hauptkomponenten: Manager (Download-Manager), Cache (zweistufiger Cache) und Processor (Transformationen). Diese Komponenten sind über Protokolle verbunden, sodass jeder Teil ausgetauscht werden kann, ohne die Abhängigkeiten zu ändern.
KingfisherManager ist die zentrale Klasse, die das Laden, Caching und die Verarbeitung von Bildern koordiniert. Sie enthält Referenzen auf ImageCache und ImageDownloader und bietet eine einzige Methode retrieveImage, die das fertige Bild nach Durchlaufen aller Phasen zurückgibt.
Beim Aufruf von retrieveImage überprüft der Manager zunächst den Memory Cache — einen NSCache mit UIImage, bei dem der Schlüssel aus der Quell-URL und dem CacheSerializer gebildet wird. Wird das Bild gefunden, wird es sofort zurückgegeben. Bei einem Fehlschlag wird der Disk Cache überprüft — Lesen aus dem Dateisystem mit Entschlüsselung über den Serializer. Ist der Disk Cache leer, wird eine Netzwerkanfrage über ImageDownloader gestellt, das Ergebnis dekodiert, transformiert und in beiden Cache-Ebenen gespeichert.
Ab Version 7.0 unterstützt Kingfisher vollständig async/await. Die Methode retrieveImage ist als asynchrone Funktion verfügbar, die Result direkt ohne Completion-Blöcke zurückgibt. Dies ermöglicht die Verwendung der Bibliothek in modernen Swift-Architekturen mit Structured Concurrency.
Kingfisher ist in mehrere Module unterteilt, von denen jedes seine eigene Aufgabe erfüllt. Diese Trennung vereinfacht das Testen und den Austausch von Komponenten.
KingfisherManager ist eine Fassade, die Laden, Cache und Prozessoren kombiniert. Standardmäßig wird der Singleton KingfisherManager.shared verwendet, aber für isolierte Szenarien (z. B. für Unit-Tests) kann eine separate Instanz mit benutzerdefinierten Einstellungen erstellt werden.
ImageCache ist ein zweistufiger Cache mit getrennten Einstellungen für Speicher und Festplatte. Der Memory Cache hat keine Begrenzung der Objektanzahl, wird aber vom System bei Speicherknappheit geleert. Der Disk Cache speichert Dateien in einem Verzeichnis mit konfigurierbarem TTL (Standard 7 Tage), Größenlimit (Standard 0 — kein Limit) und automatischer Bereinigung.
ImageProcessor ist ein Protokoll mit einer einzigen Methode process(item:options:), die das verarbeitete Bild zurückgibt. Integrierte Implementierungen: ResizingImageProcessor (Größenänderung), RoundCornerImageProcessor (Abrunden), BlurImageProcessor (Gaußscher Weichzeichner), OverlayImageProcessor (Farbüberlagerung). Prozessoren können mit dem Operator |> kombiniert werden.
Die Cache-Architektur von Kingfisher basiert auf dem Write-Through-Prinzip: Daten werden gleichzeitig auf beiden Ebenen geschrieben, und das Lesen beginnt auf der schnellsten Ebene — dem Speicher. Der Cache-Schlüssel ist die absolute Bild-URL nach Entfernen der Abfrageparameter.
| Parameter | Memory Cache | Disk Cache |
|---|---|---|
| Speicher | NSCache (RAM) | Dateisystem (SSD) |
| Format | UIImage (dekodiert) | Data (komprimiert, über Serializer) |
| Bereinigung | UIApplication.didReceiveMemoryWarningNotification | TTL + Grenzüberschreitung |
| Serialisierung | Nicht erforderlich | CacheSerializer (Standard PNG/JPEG) |
| Thread-Sicherheit | Ja (synchronisierter Zugriff) | Ja (IO-Warteschlange + Barrieren) |
Zur Verwaltung der Disk-Cache-Größe wird die Gesamtdateigröße berechnet, sortiert nach dem Datum des letzten Zugriffs. Bei Überschreitung des Limits werden die Dateien mit dem ältesten Zugriffsdatum entfernt, bis die Größe unter 50% des Limits liegt. Die TTL-Bereinigung erfolgt bei der Cache-Initialisierung und bei jedem Aufruf von cleanExpired.
Kingfisher bietet mehrere Schnittstellen zum Laden von Bildern: eine Erweiterung für UIImageView, einen separaten Manager und eine SwiftUI View.
kf ist eine Namespace-Eigenschaft auf UIImageView, die die Methoden setImage, cancelDownload und Ladeanzeigen bereitstellt. Die Methode setImage akzeptiert URLSource und optionale Parameter Options und completionHandler.
import Kingfisher
imageView.kf.setImage(
with: URL(string: "https://example.com/image.jpg"),
placeholder: UIImage(named: "placeholder"),
options: [
.processor(RoundCornerImageProcessor(radius: .point(12))),
.transition(.fade(0.3)),
.cacheMemoryOnly
],
progressBlock: { receivedSize, totalSize in
print("Geladen \(receivedSize) / \(totalSize)")
}
)
Die Methode gibt einen DownloadTask zurück, der das Abbrechen über cancel und die Fortschrittsverfolgung unterstützt. Intern ruft setImage KingfisherManager.shared.retrieveImage mit automatischer Erkennung von ImageView als Target auf.
Ab Kingfisher 7.0 ist die Methode setImage in einer asynchronen Version verfügbar. Dies ermöglicht die Integration des Bildladens in Swift Structured Concurrency ohne Callbacks.
func loadAvatar() async {
do {
let result = try await imageView.kf.setImage(
with: url,
options: [.processor(ResizingImageProcessor(
targetSize: CGSize(width: 100, height: 100)
))]
)
// result.image enthält UIImage
} catch {
print("Fehlgeschlagen: \(error)")
}
}
KFImage ist eine SwiftUI View, ähnlich wie AsyncImage aus iOS 15, aber mit vollständiger Kingfisher-Cache-Unterstützung. Die View verwendet automatisch KingfisherManager.shared, unterstützt aber einen benutzerdefinierten Manager über den Modifikator .configure.
struct AvatarView: View {
let url: URL
var body: some View {
KFImage(url)
.placeholder { ProgressView() }
.resizable()
.fade(duration: 0.25)
.forceTransition()
.frame(width: 80, height: 80)
.cornerRadius(40)
}
}
Kingfisher bietet ein integriertes Anzeigesystem zur Darstellung des Bildladefortschritts. IndicatorType ist eine Aufzählung mit drei Optionen: .activity (UIActivityIndicatorView), .progress (UIProgressView) und .custom (benutzerdefinierte Implementierung des Indicator-Protokolls). Die Anzeige erscheint automatisch über dem ImageView während des Ladens und wird nach Abschluss ausgeblendet.
Für eine benutzerdefinierte Anzeige muss das Indicator-Protokoll mit den Methoden startAnimatingView() und stopAnimatingView() implementiert werden. Dies ermöglicht hybride Lösungen: ein Skelett mit Shimmer-Animation, ein Platzhalterbild mit allmählicher Einblendung oder ein Logo mit Transparenzanimation. Kingfisher unterstützt auch das globale Setzen der Anzeige über KingfisherManager.shared.defaultOptions.
Auf der iOS-Plattform sind Kingfisher und SDWebImage die beiden dominierenden Bildladebibliotheken. Die Wahl zwischen ihnen hängt von der Projektsprache, den Leistungsanforderungen und dem Ökosystem ab.
| Kriterium | Kingfisher | SDWebImage |
|---|---|---|
| Sprache | Swift (100%) | Objective-C + Swift |
| Async/Await | Native Unterstützung | Über Wrapper |
| Combine | Integrierter Publisher | Nein |
| Sendable | Unterstützt | Eingeschränkt |
| Typsicherheit | Vollständig (Result-Typ) | Über Any? |
| ImageProcessor | Composite über |> | Transformer über && |
| Größe | ~900 KB | ~1,2 MB |
| GitHub-Sterne | 23.000+ | 25.000+ |
Der Hauptvorteil von Kingfisher ist die Swift-first-Architektur: vollständige Unterstützung für async/await, Combine Publishers, Sendable und Result-Typen. SDWebImage behält seine Führung durch das breitere Plugin-Ökosystem (WebP, SVG, MapKit) und die Objective-C-Unterstützung.
Kingfisher wird über Swift Package Manager, CocoaPods oder Carthage installiert. Nach der Installation genügt es, das Modul zu importieren und eine beliebige Lademethode aufzurufen — die Bibliothek ist ohne zusätzliche Konfiguration einsatzbereit.
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/onevcat/Kingfisher.git",
from: "7.12.0"
)
]
// CocoaPods (Podfile)
pod 'Kingfisher', '~> 7.12'
Zur Anpassung der globalen Einstellungen wird KingfisherManager.shared verwendet. Sie können das Download-Timeout, die Cache-Strategie und die Standardprozessoren ändern. Nachfolgend ein Beispiel für die Konfiguration eines 500-MB-Caches mit 14-tägigem TTL.
let cache = ImageCache(name: "custom")
cache.memoryStorage.config.totalCostLimit = 100 * 1024 * 1024
cache.diskStorage.config.sizeLimit = 500 * 1024 * 1024
cache.diskStorage.config.expiration = .days(14)
KingfisherManager.shared.cache = cache
ImageDownloader wird ebenfalls über den Manager konfiguriert: Sie können eine benutzerdefinierte URLSessionConfiguration mit Timeouts, Headern und Caching-Richtlinien festlegen. Zur Fortschrittsüberwachung steht das KFIndicator-Modul mit Unterstützung für ActivityIndicator, ProgressView und benutzerdefinierte Anzeigen zur Verfügung.
Häufig gestellte Fragen
Kingfisher ist eine Bibliothek zum Laden von Bildern auf iOS, geschrieben in reinem Swift. Sie wird zum asynchronen Laden, Caching und Transformieren von Bildern aus dem Netzwerk mit vollständiger Integration in SwiftUI, UIKit und moderne Swift-Technologien verwendet.
Fügen Sie das Paket https://github.com/onevcat/Kingfisher.git mit Version ab 7.12.0 in Xcode über File → Add Packages hinzu. Oder geben Sie die Abhängigkeit in Package.swift mit dem Parameter from: "7.12.0" an. Nach der Installation importieren Sie das Kingfisher-Modul.
Kingfisher unterstützt JPEG, PNG, GIF, APNG, HEIF und WebP. Alle Formate werden über die System-Frameworks (ImageIO, CoreGraphics) dekodiert. GIF wird über CGImageSource mit progressivem Laden und Animation unterstützt.
Kingfisher ist in reinem Swift geschrieben und unterstützt vollständig async/await, Combine und Sendable. Es bietet eine typsichere Result-API und eine modulare Architektur über Protokolle, was den Austausch von Komponenten und das Testen vereinfacht.
Zum Leeren des Memory Cache rufen Sie KingfisherManager.shared.cache.clearMemoryCache() auf. Für den Disk Cache verwenden Sie clearDiskCache(). Zum Entfernen nur abgelaufener Dateien — cleanExpiredDiskCache(). Die Cache-Größe kann über cache.calculateDiskStorageSize() überprüft werden.
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