Kingfisher је библиотека за учитавање и кеширање слика на iOS, macOS и watchOS, написана у чистом Swift-у. Према званичном репозиторијуму, библиотека пружа пуну подршку за Swift Concurrency, Combine и SwiftUI, као и аутоматско кеширање на два нивоа. Kingfisher је позната по типно безбедном API-ју и лакој интеграцији са Swift пројектима.
Главно
Kingfisher — библиотека за асинхроно учитавање и кеширање слика на Apple платформама, написана у потпуности у Swift-у. Аутор библиотеке је Wei Wang (onevcat). Kingfisher пружа скуп алата за учитавање слика из мреже са аутоматским кеширањем, трансформацијама и подршком за модерне Swift технологије: async/await, Combine, Sendable.
Библиотека има преко 23 000 звездица на GitHub-у и користи се у апликацијама попут Telegram-а, Snapchat-а и Dropbox-а. Kingfisher подржава GIF, APNG, HEIF и све стандардне формате слика. Сваки захтев враћа типно безбедан Result
Архитектура Kingfisher-а је изграђена на три главне компоненте: Manager (менаџер учитавања), Cache (двонивоски кеш) и Processor (трансформације). Ове компоненте су повезане преко протокола, што омогућава замену било ког дела без мењања зависности.
KingfisherManager — централна класа која координира учитавање, кеширање и обраду слика. Садржи референце на ImageCache и ImageDownloader и пружа јединствену методу retrieveImage која враћа спремну слику након проласка кроз све фазе.
При позиву retrieveImage, Manager прво проверава Memory Cache — NSCache са UIImage, где се кључ формира из URL-а извора и CacheSerializer-а. Ако је слика пронађена — враћа се одмах. Ако није, проверава се Disk Cache — читање из датотечног система са дешифровањем путем serializer-а. Ако је кеш на диску празан, извршава се мрежни захтев преко ImageDownloader-а, резултат се декодира, трансформише и чува на оба нивоа кеша.
Од верзије 7.0, Kingfisher у потпуности подржава async/await. Метода retrieveImage је доступна као асинхрона функција која враћа Result директно без completion блокова. Ово омогућава коришћење библиотеке у модерним Swift архитектурама са Structured Concurrency.
Kingfisher је подељена на неколико модула, од којих сваки решава свој задатак. Ова подела поједностављује тестирање и замену компоненти.
KingfisherManager — фасада која обједињује учитавање, кеш и процесоре. Подразумевано се користи синглтон KingfisherManager.shared, али се може креирати засебна инстанца са прилагођеним подешавањима за изоловане сценарије (нпр. за модуларне тестове).
ImageCache — двонивоски кеш са одвојеним подешавањима за меморију и диск. Memory Cache нема ограничење броја објеката, али га систем чисти при недостатку меморије. Disk Cache чува датотеке у директоријуму са подешавањима TTL-а (подразумевано 7 дана), границом величине (подразумевано 0 — без ограничења) и аутоматским чишћењем.
ImageProcessor — протокол са јединственом методом process(item:options:) која враћа обрађену слику. Уграђене имплементације: ResizingImageProcessor (промена величине), RoundCornerImageProcessor (заобљавање), BlurImageProcessor (Гаусово замућење), OverlayImageProcessor (наношење боје). Процесори се могу комбиновати преко оператора |>.
Архитектура кеша Kingfisher-а заснива се на принципу write-through: подаци се истовремено уписују на оба нивоа, а читање почиње од најбржег нивоа — меморије. Кључ кеша је апсолутни URL слике након уклањања query параметара.
| Параметар | Memory Cache | Disk Cache |
|---|---|---|
| Складиштење | NSCache (RAM) | Датотечни систем (SSD) |
| Формат | UIImage (декодиран) | Data (компримован, преко serializer-а) |
| Чишћење | UIApplication.didReceiveMemoryWarningNotification | TTL + прекорачење границе |
| Серијализација | Није потребна | CacheSerializer (подразумевано PNG/JPEG) |
| Безбедност нити | Да (синхронизован приступ) | Да (IO ред + баријере) |
За управљање величином Disk Cache-а користи се израчунавање укупне величине датотека са сортирањем по датуму последњег приступа. При прекорачењу границе, датотеке са најстаријим датумом приступа се бришу док величина не падне испод 50% границе. TTL чишћење се дешава при иницијализацији кеша и при сваком позиву cleanExpired.
Kingfisher пружа неколико интерфејса за учитавање слика: проширење на UIImageView, засебан менаџер и SwiftUI View.
kf — namespace својство на UIImageView-у које пружа методе setImage, cancelDownload и индикаторе учитавања. Метода setImage прихвата URLSource и опционе параметре Options и 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("Учитано \(receivedSize) / \(totalSize)")
}
)
Метода враћа DownloadTask, који подржава отказивање преко cancel и праћење напретка. Унутра, setImage позива KingfisherManager.shared.retrieveImage са аутоматским одређивањем ImageView-а као Target.
Од Kingfisher 7.0, метода setImage је доступна у асинхроној верзији. Ово омогућава интеграцију учитавања слика у Swift Structured Concurrency без 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 садржи UIImage
} catch {
print("Неуспешно: \(error)")
}
}
KFImage — SwiftUI View, слична AsyncImage из iOS 15, али са пуном подршком за кеширање Kingfisher-а. View аутоматски користи KingfisherManager.shared, али подржава прилагођени менаџер преко модификатора .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 пружа уграђени систем индикатора за приказ напретка учитавања слике. IndicatorType — набрајање са три варијанте: .activity (UIActivityIndicatorView), .progress (UIProgressView) и .custom (прилагођена имплементација протокола Indicator). Индикатор се аутоматски приказује на ImageView-у током учитавања и скрива након завршетка.
За прилагођени индикатор потребно је имплементирати протокол Indicator са методама startAnimatingView() и stopAnimatingView(). Ово омогућава коришћење хибридних решења: скелетон са shimmer анимацијом, слику-замену са постепеним појављивањем или лого са анимацијом провидности. Kingfisher такође подржава глобално подешавање индикатора преко KingfisherManager.shared.defaultOptions.
На iOS платформи, Kingfisher и SDWebImage су две доминантне библиотеке за учитавање слика. Избор између њих зависи од језика пројекта, захтева за перформансама и екосистема.
| Критеријум | Kingfisher | SDWebImage |
|---|---|---|
| Језик | Swift (100%) | Objective-C + Swift |
| Async/Await | Изворна подршка | Преко омотача |
| Combine | Уграђени Publisher | Не |
| Sendable | Подржава | Ограничено |
| Типна безбедност | Потпуна (Result тип) | Преко Any? |
| ImageProcessor | Composite преко |> | Transformer преко && |
| Величина | ~900 KB | ~1.2 MB |
| Звездице GitHub | 23 000+ | 25 000+ |
Кључна предност Kingfisher-а је Swift-first архитектура: пуна подршка за async/await, Combine Publishers, Sendable и Result типове. SDWebImage задржава лидерство захваљујући ширим екосистему додатака (WebP, SVG, MapKit) и подршци за Objective-C.
Kingfisher се инсталира преко Swift Package Manager-а, CocoaPods-а или Carthage-а. Након инсталације, довољно је импортовати модул и позвати било коју методу учитавања — библиотека је спремна за рад без додатне конфигурације.
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/onevcat/Kingfisher.git",
from: "7.12.0"
)
]
// CocoaPods (Podfile)
pod 'Kingfisher', '~> 7.12'
За прилагођавање глобалних подешавања користи се KingfisherManager.shared. Могуће је променити timeout учитавача, стратегију кеша и подразумеване процесоре. Испод је пример конфигурације кеша од 500 MB са TTL-ом од 14 дана.
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 се такође конфигурише преко менаџера: може се поставити прилагођена URLSessionConfiguration са timeouts, заглављима и политикама кеширања. За праћење напретка доступан је модул KFIndicator са подршком за ActivityIndicator, ProgressView и прилагођене индикаторе.
Често постављана питања
Kingfisher — библиотека за учитавање слика на iOS-у, написана у чистом Swift-у. Користи се за асинхроно учитавање, кеширање и трансформацију слика из мреже са потпуном интеграцијом у SwiftUI, UIKit и модерне Swift технологије.
Додајте пакет https://github.com/onevcat/Kingfisher.git са верзијом од 7.12.0 у Xcode-у преко File → Add Packages. Или наведите зависност у Package.swift са параметром from: „7.12.0“. Након инсталације, импортујте модул Kingfisher.
Kingfisher подржава JPEG, PNG, GIF, APNG, HEIF и WebP. Сви формати се декодирају преко системских оквира (ImageIO, CoreGraphics). GIF се подржава преко CGImageSource-а са прогресивним учитавањем и анимацијом.
Kingfisher је написан у чистом Swift-у и у потпуности подржава async/await, Combine и Sendable. Пружа типно безбедан Result API и модуларну архитектуру преко протокола, што поједностављује замену компоненти и тестирање.
За чишћење Memory Cache-а позовите KingfisherManager.shared.cache.clearMemoryCache(). За Disk Cache користите clearDiskCache(). За уклањање само истеклих датотека — cleanExpiredDiskCache(). Величина кеша се проверава преко cache.calculateDiskStorageSize().
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође