SDWebImage: bu nədir, əsas anlayışlar və UIImageView

Müəllif: IT Sectr Dərc olunub: 2026-05-05 Oxuma vaxtı: 8 dəq

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 — keşləmə, animasiya və transformasiya dəstəyi ilə iOS-da şəkillərin asinxron yüklənməsi üçün kitabxana.
  • SDWebImageManager — şəkillərin yüklənməsini, dekodlaşdırılmasını və keşlənməsini koordinasiya edən mərkəzi sinif.
  • Disk Cache şəkilləri diskdə saxlayır, təkrar ziyarətdə şəbəkə olmadan yükləməni təmin edir.
  • WebP və GIF SDImageWebPCoder və SDImageGIFCoder plaginləri vasitəsilə dəstəklənir.
  • SwiftUI — kitabxana deklarativ şəkil yükləməsi üçün WebImage View komponentini təqdim edir.

SDWebImage nədir?

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.

SDWebImage necə işləyir: menecer və keş

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.

Yükləmə prosesi

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.

  • Memory Cache — O(1) yoxlama, yaddaş limiti nəzərə alınmaqla UIImage saxlanması
  • Disk Cache — fayl sistemindən oxuma, sıxılmış məlumatların saxlanması
  • NSURLSession — HTTP/2 dəstəyi və konfiqurasiya edilə bilən vaxt limiti ilə yükləmə

UIImageView kateqoriyası

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-in əsas sinifləri

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

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

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

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 keş arxitekturası

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əzmunLimit
Memory CacheNSCache (NSDictionary)UIImage (dekodlaşdırılmış Bitmap)Memory warning-a qədər
Disk CacheFayl sistemiNSData (JPEG/PNG/WebP)7 gün TTL (konfiqurasiya edilə bilər)
Auto Purge CacheMemory + DiskFramework-un birləşdirilmiş keşiKonfiqurasiya 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.

Swift-də SDWebImage istifadə nümunələri

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.

UIImageView-də əsas yükləmə

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.

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

Fərdi transformasiya ilə yükləmə

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.

swift
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]
)

SwiftUI ilə istifadə

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.

swift
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-də Image Transformations

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.

SDWebImage-in Kingfisher ilə müqayisəsi

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ətSDWebImageKingfisher
DilObjective-C + Swift APISwift (100%)
SwiftUIWebImage ViewKFImage View
GIFBəli (daxili)Bəli (daxili)
WebPBə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 + DiskMemory + Disk
CocoaPods dəstəyiBəliBə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.

iOS layihəsində SDWebImage quraşdırması

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

swift
// 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 nədir və hansı vəzifələri həll edir?

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.

SDWebImage-i UITableView ilə necə istifadə etməli?

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 Kingfisher-dən nə ilə fərqlənir?

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.

SDWebImage-də WebP dəstəyini necə əlavə etməli?

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.

SDWebImage keşini proqramlı şəkildə necə təmizləməli?

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ə

  • SDWebImage — GitHub-da 25 mindən çox ulduz ilə iOS-da şəkil yükləmə üçün de-fakto standart.
  • İki səviyyəli keş (Memory + Disk) təkrar şəkillərin ani yüklənməsini və oflayn girişi təmin edir.
  • Mütərəqqi yükləmə və GIF, WebP, SVG dəstəyi kitabxananı istənilən format üçün universal həll edir.
  • SDWebImageManager hər bir komponenti fərdiləşdirmə imkanı ilə vahid yükləmə fasadı təqdim edir.
  • WebImage SwiftUI üçün bütün halların idarə edilməsi ilə deklarativ üslubda şəkil yükləməyə imkan verir.
  • Transformasiyalar (ölçü, yuvarlaqlaşdırma, rəng) && operatoru ilə birləşdirilir və keşləmədən əvvəl icra olunur.
  • Objective-C uyğunluğu SDWebImage-i Swift-ə keçid etmədən legacy layihələr üçün əlçatan edir.

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.

Layihəni müzakirə et

Həm də oxuyun