Kingfisher — iOS, macOS va watchOS uchun sof Swift-da yozilgan tasvirlarni yuklash va keshlash kutubxonasi. rasmiy repozitoriyga ko‘ra, kutubxona Swift Concurrency, Combine va SwiftUI uchun to‘liq qo‘llab-quvvatlash, shuningdek, ikki darajali avtomatik keshlashni ta‘minlaydi. Kingfisher tip-xavfsiz API va Swift loyihalari bilan oson integratsiyasi bilan tanilgan.
Asosiy fikrlar
Kingfisher — butunlay Swift-da yozilgan Apple platformalari uchun asinxron tasvir yuklash va keshlash kutubxonasi. Kutubxona muallifi Wei Wang (onevcat). Kingfisher tarmoqdan tasvirlarni avtomatik keshlash, transformatsiyalar va zamonaviy Swift texnologiyalari (async/await, Combine, Sendable) qo‘llab-quvvatlashi bilan yuklash uchun vositalar to‘plamini taqdim etadi.
Kutubxona GitHub da 23 000+ yulduz ga ega va Telegram, Snapchat va Dropbox kabi ilovalarda ishlatiladi. Kingfisher GIF, APNG, HEIF va barcha standart tasvir formatlarini qo‘llab-quvvatlaydi. Har bir so‘rov tip-xavfsiz Result
Kingfisher arxitekturasi uchta asosiy komponentga qurilgan: Manager (yuklash menejeri), Cache (ikki darajali kesh) va Processor (transformatsiyalar). Ushbu komponentlar protokollar orqali bog‘langan bo‘lib, bu qaramliklarni o‘zgartirmasdan istalgan qismni almashtirish imkonini beradi.
KingfisherManager — tasvirlarni yuklash, keshlash va qayta ishlashni muvofiqlashtiruvchi markaziy sinf. U ImageCache va ImageDownloader ga havolalarni o‘z ichiga oladi va barcha bosqichlardan o‘tgandan so‘ng tayyor tasvirni qaytaradigan yagona retrieveImage metodini taqdim etadi.
retrieveImage chaqirilganda Manager avval Memory Cache ni tekshiradi — kalit manba URL va CacheSerializer dan tuzilgan UIImage bilan NSCache. Agar tasvir topilsa — darhol qaytariladi. Topilmasa, Disk Cache tekshiriladi — serializer orqali shifrni ochish bilan fayl tizimidan o‘qish. Disk kesh bo‘sh bo‘lsa, ImageDownloader orqali tarmoq so‘rovi bajariladi, natija dekodlanadi, transformatsiya qilinadi va ikkala kesh darajasida saqlanadi.
7.0 versiyasidan boshlab, Kingfisher async/await ni to‘liq qo‘llab-quvvatlaydi. retrieveImage metodi komplitsiya bloklarisiz to‘g‘ridan-to‘g‘ri Result qaytaradigan asinxron funksiya sifatida mavjud. Bu Structured Concurrency bilan zamonaviy Swift arxitekturalarida kutubxonadan foydalanish imkonini beradi.
Kingfisher bir nechta modullarga bo‘lingan, ularning har biri o‘z vazifasini hal qiladi. Bu bo‘linish komponentlarni sinash va almashtirishni soddalashtiradi.
KingfisherManager — yuklash, kesh va protsessorlarni birlashtiruvchi fasad. Sukut bo‘yicha KingfisherManager.shared singltoni ishlatiladi, lekin izolyatsiya qilingan stsenariylar (masalan, modul testlari uchun) uchun moslashtirilgan sozlamalar bilan alohida namuna yaratilishi mumkin.
ImageCache — xotira va disk uchun alohida sozlamalar bilan ikki darajali kesh. Memory Cache ob‘ektlar soni bo‘yicha cheklovga ega emas, lekin xotira yetishmasa tizim tomonidan tozalanadi. Disk Cache fayllarni TTL (sukut bo‘yicha 7 kun), o‘lcham chegarasi (sukut bo‘yicha 0 — cheklanmagan) va avtomatik tozalash bilan katalogda saqlaydi.
ImageProcessor — qayta ishlangan tasvirni qaytaradigan yagona process(item:options:) metodi bilan protokol. Ichki tatbiqlar: ResizingImageProcessor (o‘lchamni o‘zgartirish), RoundCornerImageProcessor (yumaloqlash), BlurImageProcessor (Gauss xiraligi), OverlayImageProcessor (rang qo‘shish). Protsessorlar |> operatori bilan birlashtirilishi mumkin.
Kingfisher kesh arxitekturasi write-through tamoyiliga asoslangan: ma‘lumotlar bir vaqtning o‘zida ikkala darajada yoziladi va o‘qish eng tez darajadan — xotiradan boshlanadi. Kesh kaliti so‘rov parametrlari olib tashlanganidan keyin tasvirning mutlaq URL sidir.
| Parametr | Memory Cache | Disk Cache |
|---|---|---|
| Saqlash | NSCache (RAM) | Fayl tizimi (SSD) |
| Format | UIImage (dekodlangan) | Data (siqilgan, serializer orqali) |
| Tozalash | UIApplication.didReceiveMemoryWarningNotification | TTL + chegaradan oshish |
| Serializatsiya | Talab qilinmaydi | CacheSerializer (sukut bo‘yicha PNG/JPEG) |
| Ip xavfsizligi | Ha (sinxronlashtirilgan kirish) | Ha (IO navbati + to‘siqlar) |
Disk Cache hajmini boshqarish uchun oxirgi kirish sanasi bo‘yicha saralash bilan fayllarning umumiy hajmini hisoblash ishlatiladi. Chegara oshib ketganda, hajm chegaraning 50% dan pastga tushgunga qadar eng qadimgi kirish sanasi bo‘lgan fayllar o‘chiriladi. TTL tozalash keshni ishga tushirishda va har bir cleanExpired chaqiruvida sodir bo‘ladi.
Kingfisher tasvirlarni yuklash uchun bir nechta interfeyslarni taqdim etadi: UIImageView da kengaytma, alohida menejer va SwiftUI View.
kf — UIImageView da setImage, cancelDownload va yuklash ko‘rsatkichlarini taqdim etuvchi namespace xususiyati. setImage metodi URLSource va ixtiyoriy Options parametrlari hamda completionHandler ni qabul qiladi.
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("Yuklandi \(receivedSize) / \(totalSize)")
}
)
Metod cancel orqali bekor qilish va taraqqiyotni kuzatishni qo‘llab-quvvatlovchi DownloadTask ni qaytaradi. Ichki setImage KingfisherManager.shared.retrieveImage ni ImageView ni avtomatik Target sifatida belgilash bilan chaqiradi.
Kingfisher 7.0 dan boshlab setImage metodi asinxron versiyada mavjud. Bu callbacklarsiz Swift Structured Concurrency da tasvir yuklashni integratsiya qilish imkonini beradi.
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 ni o‘z ichiga oladi
} catch {
print("Muvaffaqiyatsiz: \(error)")
}
}
KFImage — iOS 15 dan AsyncImage ga o‘xshash, lekin Kingfisher keshlashining to‘liq qo‘llab-quvvatlashi bilan SwiftUI View. View avtomatik ravishda KingfisherManager.shared dan foydalanadi, lekin .configure modifikatori orqali moslashtirilgan menejerni qo‘llab-quvvatlaydi.
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 tasvir yuklash taraqqiyotini ko‘rsatish uchun o‘rnatilgan ko‘rsatkichlar tizimini taqdim etadi. IndicatorType — uch variantli sanab o‘tish: .activity (UIActivityIndicatorView), .progress (UIProgressView) va .custom (Indicator protokolining moslashtirilgan tatbiqi). Ko‘rsatkich yuklash vaqtida avtomatik ravishda ImageView ustida ko‘rsatiladi va tugagandan so‘ng yashiriladi.
Moslashtirilgan ko‘rsatkich uchun startAnimatingView() va stopAnimatingView() metodlari bilan Indicator protokolini tatbiq qilish kerak. Bu gibrid yechimlardan foydalanish imkonini beradi: shimmer animatsiyasi bilan skelet, asta-sekin paydo bo‘ladigan o‘rinbosar tasvir yoki shaffoflik animatsiyasi bilan logo. Kingfisher shuningdek KingfisherManager.shared.defaultOptions orqali ko‘rsatkichning global o‘rnatilishini qo‘llab-quvvatlaydi.
iOS platformasida Kingfisher va SDWebImage tasvir yuklash uchun ikkita dominant kutubxonadir. Ularning orasida tanlov loyihaning tiliga, ishlash talablariga va ekotizimga bog‘liq.
| Mezon | Kingfisher | SDWebImage |
|---|---|---|
| Til | Swift (100%) | Objective-C + Swift |
| Async/Await | Mahalliy qo‘llab-quvvatlash | O‘ram orqali |
| Combine | O‘rnatilgan Publisher | Yo‘q |
| Sendable | Qo‘llab-quvvatlaydi | Cheklangan |
| Tip xavfsizligi | To‘liq (Result tipi) | Any? orqali |
| ImageProcessor | |> bilan Composite | && bilan Transformer |
| Hajm | ~900 KB | ~1.2 MB |
| GitHub yulduzlari | 23 000+ | 25 000+ |
Kingfisher ning asosiy ustunligi Swift-first arxitekturasi: async/await, Combine Publishers, Sendable va Result tiplarining to‘liq qo‘llab-quvvatlashi. SDWebImage kengroq plagin ekotizimi (WebP, SVG, MapKit) va Objective-C qo‘llab-quvvatlashi hisobiga yetakchilikni saqlab qoladi.
Kingfisher Swift Package Manager, CocoaPods yoki Carthage orqali o‘rnatiladi. O‘rnatishdan so‘ng modulni import qilish va istalgan yuklash metodini chaqirish kifoya — kutubxona qo‘shimcha konfiguratsiyasiz ishlashga tayyor.
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/onevcat/Kingfisher.git",
from: "7.12.0"
)
]
// CocoaPods (Podfile)
pod 'Kingfisher', '~> 7.12'
Global sozlamalarni moslashtirish uchun KingfisherManager.shared ishlatiladi. Yuklagichning timeout i, kesh strategiyasi va sukut bo‘yicha protsessorlarni o‘zgartirish mumkin. Quyida 14 kun TTL bilan 500 MB kesh konfiguratsiyasi namunasi keltirilgan.
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 ham menejer orqali sozlanadi: timeoutlar, sarlavhalar va kesh siyosatlari bilan moslashtirilgan URLSessionConfiguration o‘rnatilishi mumkin. Taraqqiyotni kuzatish uchun ActivityIndicator, ProgressView va moslashtirilgan ko‘rsatkichlarni qo‘llab-quvvatlovchi KFIndicator moduli mavjud.
Tez-tez beriladigan savollar
Kingfisher — iOS uchun sof Swift da yozilgan tasvir yuklash kutubxonasi. U tarmoqdan tasvirlarni asinxron yuklash, keshlash va transformatsiya qilish uchun SwiftUI, UIKit va zamonaviy Swift texnologiyalari bilan to‘liq integratsiyada ishlatiladi.
Xcode da File → Add Packages orqali https://github.com/onevcat/Kingfisher.git paketini 7.12.0 versiyasidan qo‘shing. Yoki Package.swift da from: “7.12.0” parametri bilan qaramlikni belgilang. O‘rnatishdan so‘ng Kingfisher modulini import qiling.
Kingfisher JPEG, PNG, GIF, APNG, HEIF va WebP ni qo‘llab-quvvatlaydi. Barcha formatlar tizim freymvorklari (ImageIO, CoreGraphics) orqali dekodlanadi. GIF CGImageSource orqali progressiv yuklash va animatsiya bilan qo‘llab-quvvatlanadi.
Kingfisher sof Swift da yozilgan va async/await, Combine va Sendable ni to‘liq qo‘llab-quvvatlaydi. U tip-xavfsiz Result API va komponentlarni almashtirish va sinashni soddalashtiradigan protokollar orqali modulli arxitekturani taqdim etadi.
Memory Cache ni tozalash uchun KingfisherManager.shared.cache.clearMemoryCache() ni chaqiring. Disk Cache uchun clearDiskCache() ni ishlating. Faqat muddati o‘tgan fayllarni o‘chirish uchun — cleanExpiredDiskCache(). Kesh hajmi cache.calculateDiskStorageSize() orqali tekshiriladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.