Kingfisher är ett bibliotek för att ladda och cacha bilder på iOS, macOS och watchOS, skrivet i ren Swift. Enligt det officiella repository ger biblioteket fullt stöd för Swift Concurrency, Combine och SwiftUI, samt automatisk cachning på två nivåer. Kingfisher är känt för sitt typ-safe API och enkla integration med Swift-projekt.
Huvudpunkter
Kingfisher — ett bibliotek för asynkron laddning och cachning av bilder på Apple-plattformar, helt skrivet i Swift. Författaren till biblioteket är Wei Wang (onevcat). Kingfisher tillhandahåller en uppsättning verktyg för att ladda bilder från nätverket med automatisk cachning, transformationer och stöd för moderna Swift-teknologier: async/await, Combine, Sendable.
Biblioteket har över 23 000 stjärnor på GitHub och används i applikationer som Telegram, Snapchat och Dropbox. Kingfisher stödjer GIF, APNG, HEIF och alla standardbildformat. Varje begäran returnerar en typ-safe Result
Kingfishers arkitektur är uppbyggd på tre huvudkomponenter: Manager (laddningshanterare), Cache (tvånivåcache) och Processor (transformationer). Dessa komponenter är sammankopplade via protokoll, vilket möjliggör utbyte av vilken del som helst utan att ändra beroenden.
KingfisherManager — den centrala klassen som samordnar laddning, cachning och bearbetning av bilder. Den innehåller referenser till ImageCache och ImageDownloader och tillhandahåller en enhetlig metod retrieveImage som returnerar den färdiga bilden efter att ha passerat alla steg.
När retrieveImage anropas kontrollerar Manager först Memory Cache — NSCache med UIImage, där nyckeln bildas från källans URL och CacheSerializer. Om bilden hittas — returneras den omedelbart. Vid miss kontrolleras Disk Cache — läsning från filsystemet med dekryptering via serializer. Om cachen på disken är tom utförs en nätverksbegäran via ImageDownloader, resultatet avkodas, transformeras och sparas i båda cachenivåerna.
Från och med version 7.0 stödjer Kingfisher fullt ut async/await. Metoden retrieveImage är tillgänglig som en asynkron funktion som returnerar Result direkt utan completion-block. Detta gör det möjligt att använda biblioteket i moderna Swift-arkitekturer med Structured Concurrency.
Kingfisher är uppdelat i flera moduler, som var och en löser sin egen uppgift. Denna uppdelning förenklar testning och utbyte av komponenter.
KingfisherManager — en fasad som kombinerar laddning, cache och processorer. Som standard används singleton KingfisherManager.shared, men en separat instans med anpassade inställningar kan skapas för isolerade scenarier (t.ex. för enhetstester).
ImageCache — tvånivåcache med separata inställningar för minne och disk. Memory Cache har ingen gräns för antalet objekt men rensas av systemet vid minnesbrist. Disk Cache lagrar filer i en katalog med TTL-inställningar (standard 7 dagar), storleksgräns (standard 0 — obegränsad) och automatisk rensning.
ImageProcessor — protokoll med en enda metod process(item:options:) som returnerar den bearbetade bilden. Inbyggda implementationer: ResizingImageProcessor (storleksändring), RoundCornerImageProcessor (rundning), BlurImageProcessor (Gaussisk oskärpa), OverlayImageProcessor (färgläggning). Processorer kan kombineras med operatorn |>.
Kingfishers cachearkitektur är baserad på principen write-through: data skrivs samtidigt på båda nivåerna och läsning börjar från den snabbaste nivån — minnet. Cachenyckeln är bildens absoluta URL efter borttagning av frågeparametrar.
| Parameter | Memory Cache | Disk Cache |
|---|---|---|
| Lagring | NSCache (RAM) | Filsystem (SSD) |
| Format | UIImage (avkodad) | Data (komprimerad, via serializer) |
| Rensning | UIApplication.didReceiveMemoryWarningNotification | TTL + överskriden gräns |
| Serialisering | Krävs inte | CacheSerializer (standard PNG/JPEG) |
| Trådsäkerhet | Ja (synkroniserad åtkomst) | Ja (IO-kö + barriärer) |
För att hantera Disk Cache-storleken används beräkning av total filstorlek med sortering efter senaste åtkomstdatum. När gränsen överskrids tas filer med äldst åtkomstdatum bort tills storleken sjunker under 50 % av gränsen. TTL-rensning sker vid cacheinitiering och vid varje anrop av cleanExpired.
Kingfisher tillhandahåller flera gränssnitt för att ladda bilder: tillägg på UIImageView, separat hanterare och SwiftUI View.
kf — namespace-egenskapen på UIImageView som tillhandahåller metoderna setImage, cancelDownload och laddningsindikatorer. Metoden setImage accepterar URLSource och valfria parametrar Options och 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("Laddad \(receivedSize) / \(totalSize)")
}
)
Metoden returnerar DownloadTask, som stödjer annullering via cancel och spårning av förlopp. Internt anropar setImage KingfisherManager.shared.retrieveImage med automatisk bestämning av ImageView som Target.
Från Kingfisher 7.0 är metoden setImage tillgänglig i asynkron version. Detta möjliggör integration av bildladdning i Swift Structured Concurrency utan 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 innehåller UIImage
} catch {
print("Misslyckades: \(error)")
}
}
KFImage — SwiftUI View, liknande AsyncImage från iOS 15, men med fullt stöd för Kingfisher-cachning. View använder automatiskt KingfisherManager.shared, men stödjer anpassad hanterare via modifieraren .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 tillhandahåller ett inbyggt indikatorsystem för att visa bildladdningsförlopp. IndicatorType — en uppräkning med tre varianter: .activity (UIActivityIndicatorView), .progress (UIProgressView) och .custom (anpassad implementering av protokollet Indicator). Indikatorn visas automatiskt på ImageView under laddning och döljs efter slutförande.
För en anpassad indikator måste protokollet Indicator implementeras med metoderna startAnimatingView() och stopAnimatingView(). Detta möjliggör användning av hybridlösningar: skelett med shimmer-animation, ersättningsbild med gradvis visning eller logotyp med transparensanimation. Kingfisher stödjer också global inställning av indikator via KingfisherManager.shared.defaultOptions.
På iOS-plattformen är Kingfisher och SDWebImage de två dominerande biblioteken för bildladdning. Valet mellan dem beror på projektets språk, prestandakrav och ekosystem.
| Kriterium | Kingfisher | SDWebImage |
|---|---|---|
| Språk | Swift (100%) | Objective-C + Swift |
| Async/Await | Native stöd | Via wrapper |
| Combine | Inbyggd Publisher | Nej |
| Sendable | Stödjer | Begränsat |
| Typsäkerhet | Fullständig (Result-typ) | Via Any? |
| ImageProcessor | Composite via |> | Transformer via && |
| Storlek | ~900 KB | ~1.2 MB |
| GitHub-stjärnor | 23 000+ | 25 000+ |
Kingfishers största fördel är Swift-first-arkitekturen: fullt stöd för async/await, Combine Publishers, Sendable och Result-typer. SDWebImage behåller sin ledning tack vare ett bredare plugin-ekosystem (WebP, SVG, MapKit) och stöd för Objective-C.
Kingfisher installeras via Swift Package Manager, CocoaPods eller Carthage. Efter installation räcker det att importera modulen och anropa valfri laddningsmetod — biblioteket är redo att användas utan ytterligare konfiguration.
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/onevcat/Kingfisher.git",
from: "7.12.0"
)
]
// CocoaPods (Podfile)
pod 'Kingfisher', '~> 7.12'
För att anpassa globala inställningar används KingfisherManager.shared. Laddarens timeout, cachstrategi och standardprocessorer kan ändras. Nedan är ett exempel på cachekonfiguration på 500 MB med TTL på 14 dagar.
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 konfigureras även via hanteraren: en anpassad URLSessionConfiguration med timeouts, rubriker och cachningspolicyer kan ställas in. För att övervaka förlopp finns modulen KFIndicator med stöd för ActivityIndicator, ProgressView och anpassade indikatorer.
Vanliga frågor
Kingfisher — ett bildladdningsbibliotek för iOS skrivet i ren Swift. Det används för asynkron laddning, cachning och transformering av bilder från nätverket med full integration i SwiftUI, UIKit och moderna Swift-teknologier.
Lägg till paketet https://github.com/onevcat/Kingfisher.git med version från 7.12.0 i Xcode via File → Add Packages. Eller ange beroendet i Package.swift med parametern from: „7.12.0”. Efter installation, importera modulen Kingfisher.
Kingfisher stödjer JPEG, PNG, GIF, APNG, HEIF och WebP. Alla format avkodas via systemramverk (ImageIO, CoreGraphics). GIF stödjs via CGImageSource med progressiv laddning och animation.
Kingfisher är skrivet i ren Swift och stödjer fullt ut async/await, Combine och Sendable. Det erbjuder ett typ-safe Result API och en modulär arkitektur via protokoll, vilket förenklar komponentutbyte och testning.
För att rensa Memory Cache, anropa KingfisherManager.shared.cache.clearMemoryCache(). För Disk Cache, använd clearDiskCache(). För att endast ta bort utgångna filer — cleanExpiredDiskCache(). Cachestorleken kontrolleras via cache.calculateDiskStorageSize().
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också