Kingfisher — co to jest, kluczowe pojęcia i ImageCache

Autor: IT Sectr Opublikowano: 2026-05-05 Czas czytania: 8 min

Kingfisher to biblioteka do ładowania i buforowania obrazów na iOS, macOS i watchOS, napisana w czystym Swifcie. Według danych oficjalnego repozytorium, biblioteka zapewnia pełne wsparcie dla Swift Concurrency, Combine i SwiftUI, a także automatyczne buforowanie na dwóch poziomach. Kingfisher jest znana z bezpiecznego typowo API i łatwej integracji z projektami w Swift.

Najważniejsze

  • Kingfisher — biblioteka do ładowania obrazów w czystym Swifcie z obsługą async/await, Combine i SwiftUI.
  • KingfisherManager — centralny punkt wejścia do ładowania, śledzący pamięć podręczną i żądania sieciowe.
  • ImageCache implementuje dwupoziomowe przechowywanie: Memory Cache i Disk Cache z konfigurowalnymi limitami.
  • ImageProcessor — protokół do transformacji: zmiana rozmiaru, zaokrąglanie, rozmycie, nakładanie znaku wodnego.
  • KFImage — komponent View dla SwiftUI z deklaratywnym opisem stanów ładowania.

Czym jest Kingfisher?

Kingfisher — biblioteka do asynchronicznego ładowania i buforowania obrazów na platformach Apple, napisana w całości w Swift. Autorem biblioteki jest Wei Wang (onevcat). Kingfisher zapewnia zestaw narzędzi do ładowania obrazów z sieci z automatycznym buforowaniem, transformacjami i obsługą nowoczesnych technologii Swift: async/await, Combine, Sendable.

Biblioteka ma ponad 23 000 gwiazdek na GitHub i jest używana w takich aplikacjach jak Telegram, Snapchat i Dropbox. Kingfisher obsługuje GIF, APNG, HEIF oraz wszystkie standardowe formaty obrazów. Każde żądanie zwraca bezpieczny typowo Result, eliminujący błędy rzutowania typów.

Architektura Kingfisher opiera się na trzech głównych komponentach: Manager (menedżer pobierania), Cache (dwupoziomowa pamięć podręczna) i Processor (transformacje). Te komponenty są połączone za pomocą protokołów, co pozwala na wymianę dowolnej części bez zmiany zależności.

Jak działa Kingfisher: Manager i Cache

KingfisherManager — centralna klasa koordynująca ładowanie, buforowanie i przetwarzanie obrazów. Zawiera referencje do ImageCache i ImageDownloader oraz udostępnia jednolitą metodę retrieveImage, która zwraca gotowy obraz po przejściu wszystkich etapów.

Proces ładowania

Podczas wywołania retrieveImage Manager najpierw sprawdza Memory Cache — NSCache z UIImage, gdzie klucz jest tworzony z URL źródła i CacheSerializer. Jeśli obraz zostanie znaleziony — jest zwracany natychmiast. W przypadku braku sprawdzany jest Disk Cache — odczyt z systemu plików z deszyfracją przez serializer. Jeśli pamięć podręczna na dysku jest pusta — wykonywane jest żądanie sieciowe przez ImageDownloader, wynik jest dekodowany, transformowany i zapisywany w obu poziomach pamięci podręcznej.

  • Memory Cache — oparty na NSCache, automatycznie czyszczony przy ostrzeżeniu o pamięci
  • Disk Cache — przechowywanie plików z TTL i sprawdzaniem limitu rozmiaru
  • ImageDownloader — oparty na URLSession z obsługą modyfikacji żądania przez modyfikatory

Swift Concurrency

Od wersji 7.0, Kingfisher w pełni obsługuje async/await. Metoda retrieveImage jest dostępna jako funkcja asynchroniczna, zwracająca Result bezpośrednio bez bloków completion. Pozwala to na używanie biblioteki w nowoczesnych architekturach Swift z Structured Concurrency.

Główne moduły Kingfisher

Kingfisher jest podzielona na kilka modułów, z których każdy rozwiązuje swoje zadanie. Taki podział ułatwia testowanie i wymianę komponentów.

KingfisherManager

KingfisherManager — fasada łącząca ładowanie, pamięć podręczną i procesory. Domyślnie używany jest singleton KingfisherManager.shared, ale można utworzyć osobną instancję z niestandardowymi ustawieniami dla izolowanych scenariuszy (np. do testów modułowych).

ImageCache

ImageCache — dwupoziomowa pamięć podręczna z oddzielnymi ustawieniami dla pamięci i dysku. Memory Cache nie ma ograniczenia liczby obiektów, ale jest czyszczona przez system przy braku pamięci. Disk Cache przechowuje pliki w katalogu z ustawieniami TTL (domyślnie 7 dni), limitem rozmiaru (domyślnie 0 — bez ograniczenia) i automatycznym czyszczeniem.

ImageProcessor

ImageProcessor — protokół z pojedynczą metodą process(item:options:), zwracającą przetworzony obraz. Wbudowane implementacje: ResizingImageProcessor (zmiana rozmiaru), RoundCornerImageProcessor (zaokrąglanie), BlurImageProcessor (rozmycie gaussowskie), OverlayImageProcessor (nakładanie koloru). Procesory można łączyć za pomocą operatora |>.

System buforowania Kingfisher

Architektura pamięci podręcznej Kingfisher opiera się na zasadzie write-through: dane są zapisywane jednocześnie na obu poziomach, a odczyt zaczyna się od najszybszego poziomu — pamięci. Kluczem pamięci podręcznej jest bezwzględny URL obrazu po usunięciu parametrów zapytania.

ParametrMemory CacheDisk Cache
PrzechowywanieNSCache (RAM)System plików (SSD)
FormatUIImage (zdekodowany)Data (skompresowany, przez serializer)
CzyszczenieUIApplication.didReceiveMemoryWarningNotificationTTL + przekroczenie limitu
SerializacjaNie wymaganaCacheSerializer (domyślnie PNG/JPEG)
Bezpieczeństwo wątkoweTak (zsynchronizowany dostęp)Tak (kolejka IO + bariery)

Do zarządzania rozmiarem Disk Cache używane jest obliczanie całkowitego rozmiaru plików z sortowaniem według daty ostatniego dostępu. Po przekroczeniu limitu usuwane są pliki z najstarszą datą dostępu, aż rozmiar spadnie poniżej 50% limitu. Czyszczenie TTL odbywa się przy inicjalizacji pamięci podręcznej i przy każdym wywołaniu cleanExpired.

Przykłady użycia Kingfisher w Swift

Kingfisher udostępnia kilka interfejsów do ładowania obrazów: rozszerzenie na UIImageView, osobny menedżer i SwiftUI View.

Ładowanie w UIImageView przez kf

kf — właściwość namespace na UIImageView, udostępniająca metody setImage, cancelDownload i wskaźniki ładowania. Metoda setImage przyjmuje URLSource i opcjonalne parametry Options oraz 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("Załadowano \(receivedSize) / \(totalSize)")
    }
)

Metoda zwraca DownloadTask, który obsługuje anulowanie przez cancel i śledzenie postępu. Wewnętrznie setImage wywołuje KingfisherManager.shared.retrieveImage z automatycznym określeniem ImageView jako Target.

Użycie z async/await

Od Kingfisher 7.0, metoda setImage jest dostępna w wersji asynchronicznej. Pozwala to na integrację ładowania obrazów z Swift Structured Concurrency bez callbacków.

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 zawiera UIImage
    } catch {
        print("Niepowodzenie: \(error)")
    }
}

KFImage dla SwiftUI

KFImage — SwiftUI View, analogiczna do AsyncImage z iOS 15, ale z pełną obsługą buforowania Kingfisher. View automatycznie używa KingfisherManager.shared, ale obsługuje niestandardowy menedżer przez modyfikator .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)
    }
}

Wskaźniki ładowania w Kingfisher

Kingfisher udostępnia wbudowany system wskaźników do wyświetlania postępu ładowania obrazu. IndicatorType — wyliczenie z trzema wariantami: .activity (UIActivityIndicatorView), .progress (UIProgressView) i .custom (niestandardowa implementacja protokołu Indicator). Wskaźnik jest automatycznie wyświetlany na ImageView podczas ładowania i ukrywany po zakończeniu.

Dla niestandardowego wskaźnika należy zaimplementować protokół Indicator z metodami startAnimatingView() i stopAnimatingView(). Pozwala to na stosowanie hybrydowych rozwiązań: skeleton z animacją shimmer, obraz zastępczy z stopniowym pojawianiem się lub logo z animacją przezroczystości. Kingfisher obsługuje również ustawienie wskaźnika globalnie przez KingfisherManager.shared.defaultOptions.

Kingfisher vs SDWebImage

Na platformie iOS Kingfisher i SDWebImage są dwiema dominującymi bibliotekami do ładowania obrazów. Wybór między nimi zależy od języka projektu, wymagań dotyczących wydajności i ekosystemu.

KryteriumKingfisherSDWebImage
JęzykSwift (100%)Objective-C + Swift
Async/AwaitNatywne wsparciePrzez otoczkę
CombineWbudowany PublisherNie
SendableObsługujeOgraniczenie
Bezpieczeństwo typówPełne (typ Result)Przez Any?
ImageProcessorComposite przez |>Transformer przez &&
Rozmiar~900 KB~1.2 MB
Gwiazdki GitHub23 000+25 000+

Kluczową zaletą Kingfisher jest Swift-first architektura: pełna obsługa async/await, Combine Publishers, Sendable i typów Result. SDWebImage zachowuje przewagę dzięki szerszemu ekosystemowi wtyczek (WebP, SVG, MapKit) i obsłudze Objective-C.

Konfiguracja Kingfisher w projekcie iOS

Kingfisher jest instalowany przez Swift Package Manager, CocoaPods lub Carthage. Po instalacji wystarczy zaimportować moduł i wywołać dowolną metodę ładowania — biblioteka jest gotowa do pracy bez dodatkowej konfiguracji.

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'

Do dostosowania globalnych ustawień używany jest KingfisherManager.shared. Można zmienić timeout ładowarki, strategię pamięci podręcznej i domyślne procesory. Poniżej przykład konfiguracji pamięci podręcznej na 500 MB z TTL 14 dni.

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 jest również konfigurowany przez menedżer: można ustawić niestandardową URLSessionConfiguration z timeoutami, nagłówkami i politykami buforowania. Do monitorowania postępu dostępny jest moduł KFIndicator z obsługą ActivityIndicator, ProgressView i niestandardowych wskaźników.

Często zadawane pytania

Czym jest Kingfisher i do czego służy?

Kingfisher — biblioteka do ładowania obrazów na iOS, napisana w czystym Swifcie. Służy do asynchronicznego ładowania, buforowania i transformacji obrazów z sieci z pełną integracją z SwiftUI, UIKit i nowoczesnymi technologiami Swift.

Jak zainstalować Kingfisher przez Swift Package Manager?

Dodaj pakiet https://github.com/onevcat/Kingfisher.git w wersji od 7.12.0 w Xcode przez File → Add Packages. Lub określ zależność w Package.swift z parametrem from: „7.12.0”. Po instalacji zaimportuj moduł Kingfisher.

Jakie formaty obrazów obsługuje Kingfisher?

Kingfisher obsługuje JPEG, PNG, GIF, APNG, HEIF i WebP. Wszystkie formaty są dekodowane przez systemowe frameworki (ImageIO, CoreGraphics). GIF jest obsługiwany przez CGImageSource z progresywnym ładowaniem i animacją.

Jaką przewagę ma Kingfisher nad SDWebImage?

Kingfisher jest napisany w czystym Swifcie i w pełni obsługuje async/await, Combine i Sendable. Zapewnia bezpieczne typowo Result API i modułową architekturę przez protokoły, upraszczającą wymianę komponentów i testowanie.

Jak wyczyścić pamięć podręczną Kingfisher?

Aby wyczyścić Memory Cache, wywołaj KingfisherManager.shared.cache.clearMemoryCache(). Dla Disk Cache użyj clearDiskCache(). Aby usunąć tylko nieaktualne pliki — cleanExpiredDiskCache(). Rozmiar pamięci podręcznej sprawdza się przez cache.calculateDiskStorageSize().

Podsumowanie

  • Kingfisher — nowoczesna biblioteka do ładowania obrazów w czystym Swifcie z obsługą wszystkich aktualnych technologii Apple.
  • Dwupoziomowa pamięć podręczna (Memory + Disk) z konfigurowalnymi limitami i TTL zapewnia szybki dostęp i minimalne zużycie transferu.
  • Async/Await i Combine pozwalają na osadzenie ładowania w dowolnej architekturze bez callbacków i delegatów.
  • KFImage dla SwiftUI udostępnia deklaratywne API z placeholderem, obsługą błędów i niestandardowymi efektami przejścia.
  • ImageProcessor z kompozycją przez operator |> daje elastyczność w tworzeniu łańcuchów transformacji.
  • Bezpieczeństwo typów Result eliminuje błędy runtime przy przetwarzaniu wyników.
  • Modułowa architektura przez protokoły pozwala na wymianę Manager, Cache i Downloader do testowania i dostosowywania.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również