Kingfisher è una libreria per il caricamento e la memorizzazione nella cache di immagini su iOS, macOS e watchOS, scritta in puro Swift. Secondo il repository ufficiale, la libreria fornisce supporto completo per Swift Concurrency, Combine e SwiftUI, oltre alla memorizzazione automatica nella cache a due livelli. Kingfisher è nota per la sua API type-safe e la facile integrazione con progetti Swift.
Punti chiave
Kingfisher è una libreria per il caricamento asincrono e la memorizzazione nella cache di immagini sulle piattaforme Apple, scritta interamente in Swift. L'autore della libreria è Wei Wang (onevcat). Kingfisher fornisce una serie di strumenti per caricare immagini dalla rete con cache automatica, trasformazioni e supporto per le moderne tecnologie Swift: async/await, Combine, Sendable.
La libreria ha oltre 23.000 stelle su GitHub ed è utilizzata in applicazioni come Telegram, Snapchat e Dropbox. Kingfisher supporta GIF, APNG, HEIF e tutti i formati di immagine standard. Ogni richiesta restituisce un Result
L'architettura di Kingfisher è costruita su tre componenti principali: Manager (gestore dei download), Cache (cache a due livelli) e Processor (trasformazioni). Questi componenti sono collegati tramite protocolli, consentendo di sostituire qualsiasi parte senza modificare le dipendenze.
KingfisherManager è la classe centrale che coordina il caricamento, la memorizzazione nella cache e l'elaborazione delle immagini. Contiene riferimenti a ImageCache e ImageDownloader e fornisce un unico metodo retrieveImage che restituisce l'immagine pronta dopo aver attraversato tutte le fasi.
Quando si chiama retrieveImage, il Manager controlla prima il Memory Cache — un NSCache con UIImage, dove la chiave è formata dall'URL di origine e dal CacheSerializer. Se l'immagine viene trovata, viene restituita immediatamente. In caso di mancata corrispondenza, viene controllato il Disk Cache — lettura dal filesystem con decrittografia tramite serializzatore. Se la cache su disco è vuota, viene effettuata una richiesta di rete tramite ImageDownloader, il risultato viene decodificato, trasformato e salvato in entrambi i livelli di cache.
A partire dalla versione 7.0, Kingfisher supporta completamente async/await. Il metodo retrieveImage è disponibile come funzione asincrona, restituendo Result direttamente senza blocchi di completamento. Ciò consente di utilizzare la libreria nelle architetture Swift moderne con Structured Concurrency.
Kingfisher è divisa in diversi moduli, ciascuno dei quali risolve il proprio compito. Questa separazione semplifica i test e la sostituzione dei componenti.
KingfisherManager è una facciata che combina caricamento, cache e processori. Per impostazione predefinita, viene utilizzato il singleton KingfisherManager.shared, ma è possibile creare un'istanza separata con impostazioni personalizzate per scenari isolati (ad esempio, per test unitari).
ImageCache è una cache a due livelli con impostazioni separate per memoria e disco. Memory Cache non ha limiti sul numero di oggetti, ma il sistema lo cancella quando la memoria è scarsa. Disk Cache archivia i file in una directory con TTL configurabile (default 7 giorni), limite di dimensione (default 0 — nessun limite) e pulizia automatica.
ImageProcessor è un protocollo con un unico metodo process(item:options:) che restituisce l'immagine elaborata. Implementazioni integrate: ResizingImageProcessor (ridimensionamento), RoundCornerImageProcessor (arrotondamento), BlurImageProcessor (sfocatura gaussiana), OverlayImageProcessor (sovrapposizione colore). I processori possono essere combinati utilizzando l'operatore |>.
L'architettura della cache di Kingfisher si basa sul principio write-through: i dati vengono scritti su entrambi i livelli contemporaneamente e la lettura inizia dal livello più veloce — la memoria. La chiave della cache è l'URL assoluto dell'immagine dopo la rimozione dei parametri di query.
| Parametro | Memory Cache | Disk Cache |
|---|---|---|
| Archiviazione | NSCache (RAM) | File system (SSD) |
| Formato | UIImage (decodificato) | Data (compresso, tramite serializzatore) |
| Pulizia | UIApplication.didReceiveMemoryWarningNotification | TTL + superamento limite |
| Serializzazione | Non richiesta | CacheSerializer (default PNG/JPEG) |
| Thread safety | Sì (accesso sincronizzato) | Sì (coda IO + barriere) |
Per gestire la dimensione del Disk Cache, viene calcolata la dimensione totale dei file ordinati per data dell'ultimo accesso. Quando il limite viene superato, i file con la data di accesso più vecchia vengono rimossi fino a quando la dimensione non scende al di sotto del 50% del limite. La pulizia TTL avviene durante l'inizializzazione della cache e ad ogni chiamata a cleanExpired.
Kingfisher fornisce diverse interfacce per caricare immagini: un'estensione su UIImageView, un gestore separato e una View SwiftUI.
kf è una proprietà namespace su UIImageView che fornisce i metodi setImage, cancelDownload e gli indicatori di caricamento. Il metodo setImage accetta URLSource e i parametri opzionali Options e 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("Caricato \(receivedSize) / \(totalSize)")
}
)
Il metodo restituisce un DownloadTask che supporta l'annullamento tramite cancel e il monitoraggio del progresso. Internamente, setImage chiama KingfisherManager.shared.retrieveImage con rilevamento automatico di ImageView come Target.
A partire da Kingfisher 7.0, il metodo setImage è disponibile in una versione asincrona. Ciò consente di integrare il caricamento delle immagini in Swift Structured Concurrency senza callback.
func loadAvatar() async {
do {
let result = try await imageView.kf.setImage(
with: url,
options: [.processor(ResizingImageProcessor(
targetSize: CGSize(width: 100, height: 100)
))]
)
// result.image contiene UIImage
} catch {
print("Fallito: \(error)")
}
}
KFImage è una View SwiftUI, simile ad AsyncImage di iOS 15, ma con il supporto completo della cache di Kingfisher. La View utilizza automaticamente KingfisherManager.shared ma supporta un gestore personalizzato tramite il modificatore .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 fornisce un sistema di indicatori integrato per visualizzare lo stato di avanzamento del caricamento delle immagini. IndicatorType è un'enumerazione con tre opzioni: .activity (UIActivityIndicatorView), .progress (UIProgressView) e .custom (implementazione personalizzata del protocollo Indicator). L'indicatore appare automaticamente sopra ImageView durante il caricamento e si nasconde al termine.
Per un indicatore personalizzato, è necessario implementare il protocollo Indicator con i metodi startAnimatingView() e stopAnimatingView(). Ciò consente soluzioni ibride: uno scheletro con animazione shimmer, un'immagine segnaposto con rivelazione graduale o un logo con animazione di opacità. Kingfisher supporta anche l'impostazione globale dell'indicatore tramite KingfisherManager.shared.defaultOptions.
Sulla piattaforma iOS, Kingfisher e SDWebImage sono le due librerie dominanti per il caricamento di immagini. La scelta tra di esse dipende dal linguaggio del progetto, dai requisiti di prestazioni e dall'ecosistema.
| Criterio | Kingfisher | SDWebImage |
|---|---|---|
| Linguaggio | Swift (100%) | Objective-C + Swift |
| Async/Await | Supporto nativo | Tramite wrapper |
| Combine | Publisher integrato | No |
| Sendable | Supporta | Limitato |
| Type Safety | Completo (tipo Result) | Tramite Any? |
| ImageProcessor | Composito tramite |> | Transformer tramite && |
| Dimensione | ~900 KB | ~1,2 MB |
| Stelle GitHub | 23.000+ | 25.000+ |
Il vantaggio principale di Kingfisher è la sua architettura Swift-first: supporto completo per async/await, Combine Publishers, Sendable e tipi Result. SDWebImage mantiene la leadership grazie al suo ecosistema di plugin più ampio (WebP, SVG, MapKit) e al supporto per Objective-C.
Kingfisher viene installato tramite Swift Package Manager, CocoaPods o Carthage. Dopo l'installazione, basta importare il modulo e chiamare qualsiasi metodo di caricamento — la libreria è pronta all'uso senza configurazione aggiuntiva.
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/onevcat/Kingfisher.git",
from: "7.12.0"
)
]
// CocoaPods (Podfile)
pod 'Kingfisher', '~> 7.12'
Per personalizzare le impostazioni globali, si utilizza KingfisherManager.shared. È possibile modificare il timeout del downloader, la strategia di cache e i processori predefiniti. Di seguito è riportato un esempio di configurazione di una cache da 500 MB con TTL di 14 giorni.
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 viene configurato anche tramite il gestore: è possibile impostare una URLSessionConfiguration personalizzata con timeout, intestazioni e politiche di cache. Per il monitoraggio del progresso, è disponibile il modulo KFIndicator con supporto per ActivityIndicator, ProgressView e indicatori personalizzati.
Domande frequenti
Kingfisher è una libreria per il caricamento di immagini su iOS, scritta in puro Swift. Viene utilizzata per il caricamento asincrono, la memorizzazione nella cache e la trasformazione di immagini dalla rete con piena integrazione in SwiftUI, UIKit e le moderne tecnologie Swift.
Aggiungi il pacchetto https://github.com/onevcat/Kingfisher.git con versione da 7.12.0 in Xcode tramite File → Add Packages. Oppure specifica la dipendenza in Package.swift con il parametro from: "7.12.0". Dopo l'installazione, importa il modulo Kingfisher.
Kingfisher supporta JPEG, PNG, GIF, APNG, HEIF e WebP. Tutti i formati vengono decodificati tramite i framework di sistema (ImageIO, CoreGraphics). Il GIF è supportato tramite CGImageSource con caricamento progressivo e animazione.
Kingfisher è scritto in puro Swift e supporta completamente async/await, Combine e Sendable. Fornisce un'API Result type-safe e un'architettura modulare tramite protocolli, semplificando la sostituzione dei componenti e i test.
Per svuotare la Memory Cache, chiama KingfisherManager.shared.cache.clearMemoryCache(). Per la Disk Cache, usa clearDiskCache(). Per rimuovere solo i file scaduti — cleanExpiredDiskCache(). La dimensione della cache può essere verificata tramite cache.calculateDiskStorageSize().
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche