SDWebImage iOS va macOS-da rasmlarni asinxron yuklash uchun kutubxona bo‘lib, tarmoq, kesh va animatsiyalar bilan ishlash uchun yagona API ni taqdim etadi. rasmiy repozitoriy ma’lumotlariga ko‘ra, kutubxona 100 000 dan ortiq loyihalarda qo‘llaniladi va GIF, WebP, SVG hamda progressiv yuklashni qo‘llab-quvvatlaydi. SDWebImage diskda va xotirada avtomatik keshlash, shuningdek UIKit va SwiftUI bilan integratsiyani ta’minlaydi.
Asosiy ma’lumotlar
SDWebImage — Apple platformalarida (iOS, macOS, tvOS, watchOS) rasmlarni asinxron yuklash uchun kutubxona. UIImageView uchun sd_setImage metodi bilan kategoriyani taqdim etadi, bir qatorda istalgan manbadan rasmni yuklaydi, keshlaydi va ko‘rsatadi.
Kutubxona progressiv yuklashni (baytlar kelishi bilan rasm ko‘rsatiladi), animatsion rasmlarni (GIF, APNG), transformatsiyalarni (yumaloqlash, kesish, suv belgisi qo‘shish) va maxsus dekoderlarni qo‘llab-quvvatlaydi. GitHub Stats ma’lumotlariga ko‘ra, SDWebImage 25 mingdan ortiq yulduzga ega va Twitter, Pinterest hamda Instagram kabi yirik ilovalarda qo‘llaniladi.
Arxitektura komponentlar zanjiriga asoslangan: Coder (dekodlash), Cache (saqlash), Loader (tarmoq) va Transformer (qayta ishlash). Har bir komponent almashtirilishi mumkin, bu kutubxonani loyihaning o‘ziga xos talablariga moslashtirish imkonini beradi.
SDWebImageManager — yuklash jarayonini muvofiqlashtiruvchi markaziy komponent. URL ni qabul qiladi, keshlarni tekshiradi, ma’lumotlarni yuklaydi, ularni UIImage ga dekodlaydi va ImageView yoki Completion Handler ga uzatadi. Menejer shared singleton orqali ishlaydi, ilovaning istalgan nuqtasidan foydalanish mumkin.
Menejer ketma-ket Memory Cache (UIImage bilan NSDictionary), so‘ngra Disk Cache (fayl tizimi) ni tekshiradi. Ma’lumot bo‘lmaganda NSURLSession orqali tarmoq so‘rovi bajariladi. Yuklashdan so‘ng ma’lumotlar dekodlanadi, transformatsiyalardan o‘tadi va ikkala keshlarda saqlanadi. Butun jarayon fon navbatida bajariladi, natija main queue da yetkaziladi.
UIImageView+WebCache — sd_setImage metodini qo‘shuvchi Objective-C kategoriyasi (Swift dan foydalanish mumkin). Bu metod URL, placeholder, opsiyalar (SDWebImageOptions) va completion-blokni qabul qiladi. Kategoriya sd_cancelCurrentImageLoad mexanizmi orqali jadval katakchasini qayta ishlatishda avvalgi so‘rovni avtomatik bekor qiladi.
SDWebImage arxitekturasi aniq mas’uliyat zonalari bilan bir necha modullarga bo‘lingan. Har bir sinf yuklashdan ko‘rsatishgacha bo‘lgan bitta vazifani hal qiladi.
SDWebImageManager — rasmlar bilan barcha operatsiyalar uchun fasad. ImageCache (SDImageCache) va ImageLoader (SDWebImageDownloader) ga havolalarni o‘z ichiga oladi. SDWebImageManagerDelegate delegati orqali yuklashni tutib, URL yoki xatti-harakatni o‘zgartirish mumkin.
SDImageCache — noyob namespace bilan ishga tushiriladigan ikki darajali kesh (memory + disk). Memory Cache sozlanishi mumkin bo‘lgan limit bilan UIImage ni saqlaydi (standart — system memory warning gacha). Disk Cache ma’lumotlarni Library/Caches katalogida sozlanishi mumkin bo‘lgan saqlash muddati bilan saqlaydi (standart 7 kun).
SDWebImageDownloader — sarlavhalar, vaqt limitlari va qayta urinishlarni qo‘llab-quvvatlovchi NSURLSession asosidagi HTTP mijozi. Yuklovchi bir xil so‘rovlarni bitta tarmoq chaqiruvida birlashtiradi (deduplikatsiya) va natijani barcha obunachilar o‘rtasida taqsimlaydi.
SDWebImage deterministik tekshirish tartibi bilan ikki darajali keshlashni amalga oshiradi: avval xotira, so‘ngra disk. Kesh kaliti so‘rov parametrlarisiz rasmning mutlaq URL i yoki uning MD5 heshidir.
| Daraja | Saqlash turi | Mazmun | Limit |
|---|---|---|---|
| Memory Cache | NSCache (NSDictionary) | UIImage (dekodlangan Bitmap) | Memory warning gacha |
| Disk Cache | Fayl tizimi | NSData (JPEG/PNG/WebP) | 7 kun TTL (sozlanishi mumkin) |
| Auto Purge Cache | Memory + Disk | Framework ning birlashtirilgan keshi | Sozlanishi mumkin bo‘lgan fayl hajmi |
Memory warning olinganda iOS SDImageCache ni UIApplicationDidReceiveMemoryWarningNotification orqali xabardor qiladi, shundan so‘ng Memory Cache to‘liq tozalanadi. Disk Cache TTL yoki limit oshib ketganda tozalanadi, fayllar oxirgi kirish sanasiga ko‘ra tartiblanadi.
Keshni qo‘lda boshqarish uchun metodlar: clearMemory, clearDisk, calculateSize. Keshlashni muayyan so‘rovlar uchun SDWebImageCacheMemoryOnly yoki SDWebImageAvoidAutoSetImage opsiyalari orqali o‘chirish mumkin.
SDWebImage rasmlarni yuklash uchun bir necha interfeyslarni taqdim etadi: oddiy UIImageView kategoriyasidan tortib maxsus qayta ishlash bilan rivojlangan menejergacha.
sd_setImage — UIImageView da rasm yuklash uchun asosiy metod. URL, placeholder va Options hamda Context orqali ixtiyoriy parametrlarni qabul qiladi. Barcha Completion Handler lar asosiy thread da bajariladi.
let imageView = UIImageView()
imageView.sd_setImage(
with: URL(string: "https://example.com/photo.jpg"),
placeholderImage: UIImage(named: "placeholder"),
options: [.progressiveLoad, .retryFailed],
context: [.imageThumbnailPixelSize : CGSize(width: 300, height: 300)]
)
Metod SDWebImageToken (operatsiya) ni qaytaradi, kerak bo‘lganda bekor qilinishi mumkin. Ichki tarzda sd_setImage SDWebImageManager.load ni chaqiradi, rasmni avtomatik o‘rnatish uchun ImageView ni Target sifatida uzatadi.
SDWebImage Transformer — yagona transformedImage metodiga ega protokolni qo‘llab-quvvatlaydi. O‘rnatilgan transformatsiyalar: doira, yumaloqlash, rang filtri, hajm o‘zgartirish. Transformatsiyalarni birlashtirish && operatori orqali amalga oshiriladi.
let transformer = SDImageResizingTransformer(
size: CGSize(width: 200, height: 200),
scaleMode: .aspectFill
)
let roundedTransformer = SDImageRoundCornerTransformer(
radius: 16,
corners: .allCorners,
borderWidth: 0
)
imageView.sd_setImage(
with: url,
placeholderImage: placeholder,
context: [.imageTransformer : transformer && roundedTransformer]
)
Kutubxona WebImage — placeholder, taraqqiyot ko‘rsatkichi va xatolarni boshqarishni qo‘llab-quvvatlovchi SwiftUI uchun View komponentini taqdim etadi. Komponent avtomatik ravishda View ning hayot sikliga obuna bo‘ladi va yo‘qolganda yuklashni bekor qiladi.
struct CachedImageView: View {
let url: URL
var body: some View {
WebImage(url: url) { phase in
if let image = phase.image {
image.resizable()
} else if phase.error {
Color.red
} else {
ProgressView()
}
}
}
}
SDWebImage SDImageTransformer protokoli orqali moslashuvchan rasm transformatsiyasi tizimini taqdim etadi. Transformatsiyalar dekodlashdan so‘ng, lekin keshlashdan oldin qo‘llaniladi — transformatsiya natijasi diskda yangi kalit ostida saqlanadi, keyingi so‘rovlarda qayta qo‘llanishni oldini oladi.
O‘rnatilgan transformatsiyalar: SDImageResizingTransformer (rejim bilan hajm o‘zgartirish), SDImageRoundCornerTransformer (ixtiyoriy chegara bilan burchaklarni yumaloqlash), SDImageFlipTransformer (oyna aksi) va SDImageFilterTransformer (CoreImage filtrlari). && operatori bilan birlashtirish qayta ishlash zanjirini yaratadi.
Maxsus transformatsiyalar uchun transformedImageWithImage:forKey: metodi bilan SDImageTransformer protokolini amalga oshirish kifoya. Transformatsiya kaliti avtomatik ravishda kesh kalitiga qo‘shiladi, bir xil rasmning turli versiyalari o‘rtasida to‘qnashuvlarning oldini oladi.
iOS platformasida SDWebImage ning asosiy raqobatchilari Kingfisher (sof Swift) va Nuke dir. SDWebImage va Kingfisher o‘rtasidagi tanlov ko‘pincha loyihaning tili va talab qilinadigan funksionallikka bog‘liq.
| Xususiyat | SDWebImage | Kingfisher |
|---|---|---|
| Til | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Ha (o‘rnatilgan) | Ha (o‘rnatilgan) |
| WebP | Ha (plagin) | Ha (o‘rnatilgan) |
| Progressiv yuklash | Ha (plagin bilan) | Ha |
| Framework hajmi | ~1.2 MB | ~900 KB |
| Kesh | Memory + Disk | Memory + Disk |
| CocoaPods qo‘llab-quvvatlashi | Ha | Ha |
SDWebImage Objective-C loyihalari yoki gibrid loyihalar uchun afzal tanlov bo‘lib qolmoqda. Kingfisher tip xavfsizligi va mahalliy Swift sintaksisi tufayli sof Swift loyihalari uchun ko‘proq mos keladi. Ikkala kutubxona ham o‘xshash kesh arxitekturasi va tezlikka ega.
SDWebImage ni ulash Swift Package Manager, CocoaPods yoki Carthage orqali amalga oshiriladi. Kutubxona modullarga bo‘lingan: asosiy (SDWebImage), Coder (qo‘shimcha formatlar) va MapKit (MKAnnotationView uchun).
// Swift Package Manager (Package.swift)
dependencies: [
.package(
url: "https://github.com/SDWebImage/SDWebImage.git",
from: "5.19.0"
)
]
// CocoaPods (Podfile)
pod 'SDWebImage', '~> 5.19.0'
// WebP va SVG uchun plaginlar:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
O‘rnatishdan so‘ng kutubxona qo‘shimcha sozlamalarsiz foydalanishga tayyor. Keshni sozlash uchun noyob namespace bilan SDImageCache namunasi yaratiladi, u ishga tushirishda SDWebImageManager ga uzatiladi. Global konfiguratsiya SDWebImageManager.shared orqali amalga oshiriladi.
// Keshni sozlash
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 7 o‘rniga 14 kun
config.maxDiskSize = 500 * 1024 * 1024 // 500 MB
config.shouldCacheImagesInMemory = .true
let cache = SDImageCache(
namespace: "custom",
diskCacheDirectory: FileManager.default.urls(
for: .cachesDirectory,
in: .userDomainMask
).first?.appendingPathComponent("custom_cache"),
config: config
)
SDWebImageManager.sharedImageCache = cache
Ko‘p beriladigan savollar
SDWebImage — iOS va macOS da rasmlarni asinxron yuklash uchun kutubxona. Tarmoqdan rasmlarni keshlash, dekodlash, transformatsiya qilish va ko‘rsatish vazifalarini hal qiladi, dasturchini thread va xotirani qo‘lda boshqarishdan ozod qiladi.
cellForRowAt metodida sd_setImage ni URL va placeholder bilan ishlating. Kutubxona katakchani qayta ishlatishda avvalgi so‘rovni avtomatik bekor qiladi. Silliq siljitish uchun .progressiveLoad opsiyasini belgilang va thumbnail hajmini kontekst orqali sozlang.
SDWebImage Objective-C da Swift qobig‘i bilan yozilgan, Kingfisher esa sof Swift da. SDWebImage kengroq plagin ekotizimiga ega (WebP, SVG, MapKit). Kingfisher yaxshiroq tip xavfsizligi va Swift Concurrency bilan integratsiyani ta’minlaydi.
SDWebImageWebPCoder plaginini CocoaPods yoki SPM orqali o‘rnating. Koder SDImageWebPCoder.shared ni AppDelegate da chaqirish orqali ro‘yxatdan o‘tkazing. Ro‘yxatdan o‘tkazilgandan so‘ng kutubxona formatni avtomatik aniqlaydi va WebP ni dekodlaydi.
Xotira uchun SDImageCache.shared.clearMemory() va disk uchun SDImageCache.shared.clearDisk() ni chaqiring. Faqat eskirgan fayllarni tozalash uchun TTL tekshiruvi bilan clearDisk(completion:) dan foydalaning. calculateSizeWithCompletionBlock metodi joriy kesh hajmini qaytaradi.
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.