Kingfisher — cos'è, concetti chiave e ImageCache

Autore: IT Sectr Pubblicato: 2026-05-05 Tempo di lettura: 8 min

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 di caricamento immagini in puro Swift con supporto per async/await, Combine e SwiftUI.
  • KingfisherManager è un punto di ingresso unico per il caricamento, che tiene traccia della cache e delle richieste di rete.
  • ImageCache implementa l'archiviazione a due livelli: Memory Cache e Disk Cache con limiti configurabili.
  • ImageProcessor è un protocollo per le trasformazioni: ridimensionamento, arrotondamento, sfocatura, aggiunta di filigrana.
  • KFImage è un componente View per SwiftUI con descrizione dichiarativa degli stati di caricamento.

Cos'è Kingfisher?

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 type-safe, eliminando gli errori di conversione dei tipi.

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.

Come funziona Kingfisher: Manager e Cache

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.

Processo di caricamento

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.

  • Memory Cache — basato su NSCache, cancellato automaticamente in caso di avviso di memoria
  • Disk Cache — archiviazione file con TTL e controllo del limite di dimensione
  • ImageDownloader — basato su URLSession con supporto per la modifica delle richieste tramite modificatori

Swift Concurrency

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.

Moduli principali di Kingfisher

Kingfisher è divisa in diversi moduli, ciascuno dei quali risolve il proprio compito. Questa separazione semplifica i test e la sostituzione dei componenti.

KingfisherManager

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

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

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

Sistema di cache di Kingfisher

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.

ParametroMemory CacheDisk Cache
ArchiviazioneNSCache (RAM)File system (SSD)
FormatoUIImage (decodificato)Data (compresso, tramite serializzatore)
PuliziaUIApplication.didReceiveMemoryWarningNotificationTTL + superamento limite
SerializzazioneNon richiestaCacheSerializer (default PNG/JPEG)
Thread safetySì (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.

Esempi di utilizzo di Kingfisher in Swift

Kingfisher fornisce diverse interfacce per caricare immagini: un'estensione su UIImageView, un gestore separato e una View SwiftUI.

Caricamento in UIImageView tramite kf

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.

swift
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.

Utilizzo con async/await

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.

swift
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 per SwiftUI

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.

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

Indicatori di caricamento in Kingfisher

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.

Kingfisher vs SDWebImage

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.

CriterioKingfisherSDWebImage
LinguaggioSwift (100%)Objective-C + Swift
Async/AwaitSupporto nativoTramite wrapper
CombinePublisher integratoNo
SendableSupportaLimitato
Type SafetyCompleto (tipo Result)Tramite Any?
ImageProcessorComposito tramite |> Transformer tramite &&
Dimensione~900 KB~1,2 MB
Stelle GitHub23.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.

Configurazione di Kingfisher in un progetto iOS

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
// 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.

swift
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

Cos'è Kingfisher e a cosa serve?

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.

Come installare Kingfisher tramite Swift Package Manager?

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.

Quali formati immagine supporta 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.

Qual è il vantaggio di Kingfisher rispetto a SDWebImage?

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.

Come svuotare la cache di Kingfisher?

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

  • Kingfisher è una libreria moderna di caricamento immagini in puro Swift con supporto per tutte le tecnologie Apple attuali.
  • Cache a due livelli (Memory + Disk) con limiti configurabili e TTL garantisce un accesso rapido e un utilizzo minimo dei dati.
  • Async/Await e Combine consentono di incorporare il caricamento in qualsiasi architettura senza callback e delegati.
  • KFImage per SwiftUI fornisce un'API dichiarativa con placeholder, errore ed effetti di transizione personalizzati.
  • ImageProcessor con composizione tramite l'operatore |> offre flessibilità nella creazione di catene di trasformazioni.
  • Type Safety Result elimina gli errori di runtime durante l'elaborazione dei risultati.
  • Architettura modulare tramite protocolli consente di sostituire Manager, Cache e Downloader per test e personalizzazione.

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.

Discuti il progetto

Leggi anche