SDWebImage iOS və macOS-da şəkillərin asinxron yüklənməsi üçün kitabxanadır, şəbəkə, keş və animasiyalarla iş üçün vahid API təmin edir. rəsmi repozitoriyanın məlumatlarına görə, kitabxana 100 000-dən çox layihədə istifadə olunur və GIF, WebP, SVG və mütərəqqi yükləməni dəstəkləyir. SDWebImage diskdə və yaddaşda avtomatik keşləmə, həmçinin UIKit və SwiftUI ilə inteqrasiyanı təmin edir.
Əsas məqamlar
SDWebImage — Apple platformalarında (iOS, macOS, tvOS, watchOS) şəkillərin asinxron yüklənməsi üçün kitabxana. UIImageView üçün sd_setImage metodu ilə kateqoriya təqdim edir, bir sətirlə istənilən mənbədən şəkli yükləyir, keşləyir və göstərir.
Kitabxana mütərəqqi yükləməni (baytlar alındıqca şəkil göstərilir), animasiyalı şəkilləri (GIF, APNG), transformasiyaları (yuvarlaqlaşdırma, kəsmə, su nişanı əlavə etmə) və fərdi dekoderləri dəstəkləyir. GitHub Stats məlumatlarına görə, SDWebImage 25 mindən çox ulduza malikdir və Twitter, Pinterest və Instagram daxil olmaqla böyük tətbiqlərdə istifadə olunur.
Arxitektura komponentlər zəncirinə əsaslanır: Coder (dekodlaşdırma), Cache (saxlama), Loader (şəbəkə) və Transformer (emal). Hər bir komponent dəyişdirilə bilər, bu da kitabxananı layihənin xüsusi tələblərinə uyğunlaşdırmağa imkan verir.
SDWebImageManager — yükləmə prosesini koordinasiya edən mərkəzi komponent. URL qəbul edir, keşi yoxlayır, məlumatları yükləyir, UIImage-ə dekodlaşdırır və ImageView və ya Completion Handler-ə ötürür. Menecer shared singleton vasitəsilə işləyir, tətbiqin istənilən yerindən əlçatandır.
Menecer ardıcıl olaraq Memory Cache (UIImage ilə NSDictionary), sonra Disk Cache (fayl sistemi) yoxlayır. Məlumat olmadıqda NSURLSession vasitəsilə şəbəkə sorğusu icra edilir. Yükləmədən sonra məlumatlar dekodlaşdırılır, transformasiyalardan keçir və hər iki keşdə saxlanılır. Bütün proses fon növbəsində icra olunur, nəticə main queue-da çatdırılır.
UIImageView+WebCache — sd_setImage metodu əlavə edən Objective-C kateqoriyası (Swift-dən əlçatandır). Bu metod URL, placeholder, opsiyalar (SDWebImageOptions) və completion-blok qəbul edir. Kateqoriya sd_cancelCurrentImageLoad mexanizmi vasitəsilə cədvəl hücrəsinin təkrar istifadəsində əvvəlki sorğunu avtomatik ləğv edir.
SDWebImage arxitekturası aydın məsuliyyət zonaları ilə bir neçə modula bölünmüşdür. Hər bir sinif yükləmədən göstərməyə qədər bir vəzifə həll edir.
SDWebImageManager — şəkillərlə bütün əməliyyatlar üçün fasad. ImageCache (SDImageCache) və ImageLoader (SDWebImageDownloader) istinadlarını ehtiva edir. SDWebImageManagerDelegate delegatı vasitəsilə yükləməni ələ keçirib URL və ya davranışı dəyişmək olar.
SDImageCache — unikal namespace ilə işə salınan iki səviyyəli keş (memory + disk). Memory Cache konfiqurasiya edilə bilən limitlə UIImage saxlayır (standart — system memory warning-a qədər). Disk Cache məlumatları Library/Caches kataloqunda konfiqurasiya edilə bilən saxlama müddəti ilə saxlayır (standart 7 gün).
SDWebImageDownloader — başlıqlar, vaxt limitləri və təkrar cəhdlər dəstəyi ilə NSURLSession əsaslı HTTP müştərisi. Yükləyici eyni sorğuları bir şəbəkə çağırışında birləşdirir (deduplikasiya) və nəticəni bütün abunəçilər arasında bölüşdürür.
SDWebImage deterministik yoxlama ardıcıllığı ilə iki səviyyəli keşləmə tətbiq edir: əvvəlcə yaddaş, sonra disk. Keş açarı query-parametrləri olmadan şəklin mütləq URL-i və ya onun MD5-heşidir.
| Səviyyə | Saxlama növü | Məzmun | Limit |
|---|---|---|---|
| Memory Cache | NSCache (NSDictionary) | UIImage (dekodlaşdırılmış Bitmap) | Memory warning-a qədər |
| Disk Cache | Fayl sistemi | NSData (JPEG/PNG/WebP) | 7 gün TTL (konfiqurasiya edilə bilər) |
| Auto Purge Cache | Memory + Disk | Framework-un birləşdirilmiş keşi | Konfiqurasiya edilə bilən fayl ölçüsü |
Memory warning aldıqda iOS SDImageCache-ə UIApplicationDidReceiveMemoryWarningNotification vasitəsilə xəbərdarlıq edir, bundan sonra Memory Cache tam təmizlənir. Disk Cache TTL və ya limit aşıldıqda təmizlənir, fayllar son giriş tarixinə görə sıralanır.
Keşin əl ilə idarə edilməsi üçün metodlar: clearMemory, clearDisk, calculateSize. Keşləməni konkret sorğular üçün SDWebImageCacheMemoryOnly və ya SDWebImageAvoidAutoSetImage opsiyaları ilə söndürmək olar.
SDWebImage şəkillərin yüklənməsi üçün bir neçə interfeys təqdim edir: sadə UIImageView kateqoriyasından fərdi emal ilə təkmil menecerə qədər.
sd_setImage — UIImageView-də şəkil yükləmək üçün əsas metod. URL, placeholder və Options və Context vasitəsilə isteğe bağlı parametrlər qəbul edir. Bütün Completion Handler əsas thread-də icra olunur.
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 (əməliyyat) qaytarır, lazım olduqda ləğv edilə bilər. Daxildə sd_setImage SDWebImageManager.load-u çağırır, şəklin avtomatik qurulması üçün ImageView-i Target kimi ötürür.
SDWebImage Transformer — tək transformedImage metodu olan protokolu dəstəkləyir. Daxili transformasiyalar: dairə, yuvarlaqlaşdırma, rəng filtri, ölçü dəyişmə. Transformasiyaların birləşdirilməsi && operatoru ilə aparılır.
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]
)
Kitabxana WebImage — placeholder, gedişat göstəricisi və xəta idarəetmə dəstəyi ilə SwiftUI üçün View komponentini təqdim edir. Komponent avtomatik olaraq View-in həyat dövrünə abunə olur və yox olduqda yükləməni ləğv edir.
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 protokolu vasitəsilə çevik şəkil transformasiya sistemi təqdim edir. Transformasiyalar dekodlaşdırmadan sonra, lakin keşləmədən əvvəl tətbiq olunur — transformasiya nəticəsi yeni açar altında diskdə saxlanılır, növbəti sorğularda təkrar tətbiq edilmir.
Daxili transformasiyalara daxildir: SDImageResizingTransformer (rejimlə ölçü dəyişmə), SDImageRoundCornerTransformer (isteğe bağlı haşiyə ilə künclərin yuvarlaqlaşdırılması), SDImageFlipTransformer (güzgü əks etdirmə) və SDImageFilterTransformer (CoreImage filtrləri). && operatoru ilə birləşdirmə emal zənciri yaradır.
Fərdi transformasiyalar üçün transformedImageWithImage:forKey: metodu ilə SDImageTransformer protokolunu tətbiq etmək kifayətdir. Transformasiya açarı avtomatik olaraq keş açarına əlavə olunur, eyni şəklin müxtəlif versiyaları arasında toqquşmaların qarşısını alır.
iOS platformasında SDWebImage-in əsas rəqibləri Kingfisher (təmiz Swift) və Nuke-dir. SDWebImage və Kingfisher arasında seçim çox vaxt layihənin dilindən və tələb olunan funksionallıqdan asılıdır.
| Xüsusiyyət | SDWebImage | Kingfisher |
|---|---|---|
| Dil | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Bəli (daxili) | Bəli (daxili) |
| WebP | Bəli (plagin) | Bəli (daxili) |
| Mütərəqqi yükləmə | Bəli (plaginlə) | Bəli |
| Framework ölçüsü | ~1.2 MB | ~900 KB |
| Keş | Memory + Disk | Memory + Disk |
| CocoaPods dəstəyi | Bəli | Bəli |
SDWebImage Objective-C layihələri və ya hibrid layihələr üçün üstünlük verilən seçim olaraq qalır. Kingfisher tip təhlükəsizliyi və doğma Swift sintaksisi sayəsində təmiz Swift layihələri üçün daha uyğundur. Hər iki kitabxana oxşar keş arxitekturasına və sürətə malikdir.
SDWebImage-in qoşulması Swift Package Manager, CocoaPods və ya Carthage vasitəsilə həyata keçirilir. Kitabxana modullara bölünür: əsas (SDWebImage), Coder (əlavə formatlar) və MapKit (MKAnnotationView üçün).
// 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 və SVG üçün plaginlər:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
Quraşdırmadan sonra kitabxana əlavə konfiqurasiya olmadan istifadəyə hazırdır. Keşi fərdiləşdirmək üçün unikal namespace ilə SDImageCache nümunəsi yaradılır, SDWebImageManager-ə başlatma zamanı ötürülür. Qlobal konfiqurasiya SDWebImageManager.shared vasitəsilə aparılır.
// Keşin fərdiləşdirilməsi
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 7 əvəzinə 14 gün
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
Tez-tez verilən suallar
SDWebImage — iOS və macOS-da şəkillərin asinxron yüklənməsi üçün kitabxana. Şəbəkədən şəkillərin keşlənməsi, dekodlaşdırılması, transformasiyası və göstərilməsi vəzifələrini həll edir, proqramçını thread və yaddaşın əl ilə idarə edilməsindən azad edir.
cellForRowAt metodunda sd_setImage URL və placeholder ilə istifadə edin. Kitabxana hücrənin təkrar istifadəsində əvvəlki sorğunu avtomatik ləğv edir. Hamar sürüşdürmə üçün .progressiveLoad opsiyasını göstərin və thumbnail ölçüsünü kontekst vasitəsilə konfiqurasiya edin.
SDWebImage Objective-C-də Swift qabığı ilə yazılmışdır, Kingfisher təmiz Swift-dədir. SDWebImage daha geniş plagin ekosisteminə malikdir (WebP, SVG, MapKit). Kingfisher daha yaxşı tip təhlükəsizliyi və Swift Concurrency ilə inteqrasiya təmin edir.
SDWebImageWebPCoder plaginini CocoaPods və ya SPM vasitəsilə quraşdırın. AppDelegate-də SDImageWebPCoder.shared çağırışı ilə koderi qeydiyyatdan keçirin. Qeydiyyatdan sonra kitabxana formatı avtomatik müəyyən edir və WebP dekodlaşdırır.
Yaddaş üçün SDImageCache.shared.clearMemory() və disk üçün SDImageCache.shared.clearDisk() çağırın. Yalnız köhnəlmiş faylları təmizləmək üçün TTL yoxlaması ilə clearDisk(completion:) istifadə edin. calculateSizeWithCompletionBlock metodu cari keş ölçüsünü qaytarır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun