Kingfisher — bu nima, asosiy tushunchalar va ImageCache

Muallif: IT Sectr Nashr etilgan: 2026-05-05 O'qish vaqti: 8 daq

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 — async/await, Combine va SwiftUI qo‘llab-quvvatlashi bilan sof Swift-da tasvir yuklash kutubxonasi.
  • KingfisherManager — keshlash va tarmoq so‘rovlarini kuzatuvchi yagona kirish nuqtasi.
  • ImageCache sozlanishi mumkin bo‘lgan chegaralar bilan Memory Cache va Disk Cache: ikki darajali saqlashni amalga oshiradi.
  • ImageProcessor — transformatsiyalar uchun protokol: o‘lchamni o‘zgartirish, yumaloqlash, xiralashtirish, suv belgisi qo‘shish.
  • KFImage — SwiftUI uchun yuklash holatlarining deklarativ tavsifi bilan View komponenti.

Kingfisher nima?

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 qaytaradi va tip konvertatsiya xatolarini bartaraf qiladi.

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.

Kingfisher qanday ishlaydi: Manager va Cache

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.

Yuklash jarayoni

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.

  • Memory Cache — NSCache asosida, xotira ogohlantirishida avtomatik tozalanadi
  • Disk Cache — TTL va o‘lcham chegarasini tekshirish bilan fayl saqlash
  • ImageDownloader — modifikatorlar orqali so‘rovni o‘zgartirish qo‘llab-quvvatlashi bilan URLSession asosida

Swift Concurrency

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.

Kingfisherning asosiy modullari

Kingfisher bir nechta modullarga bo‘lingan, ularning har biri o‘z vazifasini hal qiladi. Bu bo‘linish komponentlarni sinash va almashtirishni soddalashtiradi.

KingfisherManager

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

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

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 keshlash tizimi

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.

ParametrMemory CacheDisk Cache
SaqlashNSCache (RAM)Fayl tizimi (SSD)
FormatUIImage (dekodlangan)Data (siqilgan, serializer orqali)
TozalashUIApplication.didReceiveMemoryWarningNotificationTTL + chegaradan oshish
SerializatsiyaTalab qilinmaydiCacheSerializer (sukut bo‘yicha PNG/JPEG)
Ip xavfsizligiHa (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.

Swift-da Kingfisher dan foydalanish misollari

Kingfisher tasvirlarni yuklash uchun bir nechta interfeyslarni taqdim etadi: UIImageView da kengaytma, alohida menejer va SwiftUI View.

UIImageView da kf orqali yuklash

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.

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

async/await bilan ishlatish

Kingfisher 7.0 dan boshlab setImage metodi asinxron versiyada mavjud. Bu callbacklarsiz Swift Structured Concurrency da tasvir yuklashni integratsiya qilish imkonini beradi.

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 UIImage ni o‘z ichiga oladi
    } catch {
        print("Muvaffaqiyatsiz: \(error)")
    }
}

SwiftUI uchun KFImage

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.

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

Kingfisher da yuklash ko‘rsatkichlari

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.

Kingfisher vs SDWebImage

iOS platformasida Kingfisher va SDWebImage tasvir yuklash uchun ikkita dominant kutubxonadir. Ularning orasida tanlov loyihaning tiliga, ishlash talablariga va ekotizimga bog‘liq.

MezonKingfisherSDWebImage
TilSwift (100%)Objective-C + Swift
Async/AwaitMahalliy qo‘llab-quvvatlashO‘ram orqali
CombineO‘rnatilgan PublisherYo‘q
SendableQo‘llab-quvvatlaydiCheklangan
Tip xavfsizligiTo‘liq (Result tipi)Any? orqali
ImageProcessor|> bilan Composite&& bilan Transformer
Hajm~900 KB~1.2 MB
GitHub yulduzlari23 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.

iOS loyihasida Kingfisher ni sozlash

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

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 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 nima va u nima uchun ishlatiladi?

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.

Kingfisher ni Swift Package Manager orqali qanday o‘rnatish mumkin?

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 qanday tasvir formatlarini qo‘llab-quvvatlaydi?

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 ning SDWebImage dan ustunligi nimada?

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.

Kingfisher keshini qanday tozalash mumkin?

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

  • Kingfisher — barcha zamonaviy Apple texnologiyalarini qo‘llab-quvvatlovchi sof Swift da zamonaviy tasvir yuklash kutubxonasi.
  • Ikki darajali kesh (Memory + Disk) sozlanishi mumkin bo‘lgan chegaralar va TTL bilan tezkor kirish va minimal trafik sarfini ta‘minlaydi.
  • Async/Await va Combine callbacklar va delegatsiyalarsiz yuklashni istalgan arxitekturaga o‘rnatish imkonini beradi.
  • KFImage SwiftUI uchun placeholder, xato boshqaruvi va moslashtirilgan o‘tish effektlari bilan deklarativ API ni taqdim etadi.
  • ImageProcessor |> operatori bilan kompozitsiya orqali transformatsiya zanjirlarini yaratishda moslashuvchanlik beradi.
  • Tip xavfsizligi Result natijalarni qayta ishlashda runtime xatolarini bartaraf qiladi.
  • Modulli arxitektura protokollar orqali sinash va moslashtirish uchun Manager, Cache va Downloader ni almashtirish imkonini beradi.

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.

Loyihani muhokama qilish

Shuningdek o'qing