SDWebImage, iOS ve macOS'ta zaman uyumsuz görüntü yükleme için bir kitaplıktır ve ağ, önbellek ve animasyonlarla çalışmak için birleşik bir API sağlar. Resmi depoya göre, kitaplık 100.000'den fazla projede kullanılmakta ve GIF, WebP, SVG ve aşamalı yüklemeyi desteklemektedir. SDWebImage, diskte ve bellekte otomatik önbelleklemenin yanı sıra UIKit ve SwiftUI ile entegrasyon sağlar.
Önemli Noktalar
SDWebImage, Apple platformlarında (iOS, macOS, tvOS, watchOS) zaman uyumsuz görüntü yükleme için bir kitaplıktır. UIImageView için sd_setImage yöntemiyle bir kategori sağlar ve tek bir kod satırıyla herhangi bir kaynaktan görüntü yükler, önbelleğe alır ve görüntüler.
Kitaplık aşamalı yüklemeyi (baytlar alındıkça görüntü görünür), animasyonlu görüntüleri (GIF, APNG), dönüşümleri (yuvarlama, kırpma, filigran ekleme) ve özel kod çözücüleri destekler. GitHub İstatistiklerine göre, SDWebImage 25.000'den fazla yıldıza sahiptir ve Twitter, Pinterest ve Instagram dahil olmak üzere büyük uygulamalarda kullanılmaktadır.
Mimari bir bileşen zinciri üzerine kurulmuştur: Coder (kod çözme), Cache (depolama), Loader (ağ) ve Transformer (işleme). Her bileşen değiştirilebilir, bu da kitaplığın belirli proje gereksinimlerine uyarlanmasına olanak tanır.
SDWebImageManager, yükleme sürecini koordine eden merkezi bileşendir. Bir URL alır, önbelleği kontrol eder, verileri yükler, UIImage'e kod çözer ve ImageView veya Completion Handler'a iletir. Yönetici, uygulamanın her yerinden erişilebilen paylaşılan bir singleton aracılığıyla çalışır.
Yönetici sırasıyla Bellek Önbelleğini (UIImage ile NSDictionary), ardından Disk Önbelleğini (dosya sistemi) kontrol eder. Bulunamadığında, NSURLSession aracılığıyla bir ağ isteği yapılır. Yüklemeden sonra veriler kod çözülür, dönüşümlerden geçer ve her iki önbelleğe kaydedilir. Tüm süreç arka plan kuyruğunda çalışır ve sonuçlar ana kuyruğa teslim edilir.
UIImageView+WebCache, sd_setImage yöntemini ekleyen bir Objective-C kategorisidir (Swift'ten erişilebilir). Bu yöntem bir URL, placeholder, seçenekler (SDWebImageOptions) ve bir tamamlama bloğu alır. Kategori, sd_cancelCurrentImageLoad mekanizması aracılığıyla bir tablo hücresi yeniden kullanıldığında önceki isteği otomatik olarak iptal eder.
SDWebImage mimarisi, net sorumluluk alanlarına sahip birkaç modüle ayrılmıştır. Her sınıf, yüklemeden görüntülemeye kadar tek bir görevi çözer.
SDWebImageManager, tüm görüntü işlemleri için cephedir. ImageCache (SDImageCache) ve ImageLoader'a (SDWebImageDownloader) referanslar içerir. SDWebImageManagerDelegate aracılığıyla yüklemeyi durdurabilir ve URL'yi veya davranışı değiştirebilirsiniz.
SDImageCache, benzersiz bir ad alanıyla başlatılan iki düzeyli bir önbellektir (bellek + disk). Bellek Önbelleği, yapılandırılabilir bir sınırla (varsayılan olarak — sistem bellek uyarısına kadar) UIImage depolar. Disk Önbelleği, Library/Caches dizininde yapılandırılabilir bir saklama süresiyle (varsayılan 7 gün) veri depolar.
SDWebImageDownloader, başlıklar, zaman aşımları ve yeniden denemeler desteğiyle NSURLSession tabanlı bir HTTP istemcisidir. İndirici, aynı istekleri tek bir ağ çağrısında tekilleştirir ve sonucu tüm abonelere dağıtır.
SDWebImage, belirleyici bir kontrol sırasıyla iki düzeyli önbellekleme uygular: önce bellek, sonra disk. Önbellek anahtarı, sorgu parametreleri olmayan mutlak görüntü URL'si veya MD5 hash'idir.
| Düzey | Depolama türü | İçerik | Sınır |
|---|---|---|---|
| Bellek Önbelleği | NSCache (NSDictionary) | UIImage (kod çözülmüş Bitmap) | Bellek uyarısına kadar |
| Disk Önbelleği | Dosya sistemi | NSData (JPEG/PNG/WebP) | 7 gün TTL (yapılandırılabilir) |
| Otomatik Temizleme Önbelleği | Bellek + Disk | Birleşik framework önbelleği | Yapılandırılabilir dosya boyutu |
Bir bellek uyarısı aldığında, iOS UIApplicationDidReceiveMemoryWarningNotification aracılığıyla SDImageCache'i bilgilendirir ve ardından Bellek Önbelleği tamamen temizlenir. Disk Önbelleği, TTL'ye göre veya sınır aşıldığında, dosyalar son erişim tarihine göre sıralanarak temizlenir.
Manuel önbellek yönetimi için şu yöntemler mevcuttur: clearMemory, clearDisk, calculateSize. SDWebImageCacheMemoryOnly veya SDWebImageAvoidAutoSetImage seçenekleri kullanılarak belirli istekler için önbellekleme devre dışı bırakılabilir.
SDWebImage, görüntü yüklemek için çeşitli arayüzler sağlar: basit UIImageView kategorisinden özel işlemeli gelişmiş yöneticiye kadar.
sd_setImage, UIImageView'e görüntü yüklemek için birincil yöntemdir. Bir URL, placeholder ve Options ile Context aracılığıyla isteğe bağlı parametreler alır. Tüm Completion Handler'lar ana iş parçacığında yürütülür.
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)]
)
Yöntem, gerektiğinde iptal edilebilen bir SDWebImageToken (işlem) döndürür. Dahili olarak, sd_setImage, otomatik görüntü ayarı için ImageView'ı Target olarak ileterek SDWebImageManager.load'u çağırır.
SDWebImage, Transformer'ı — tek bir transformedImage yöntemine sahip bir protokolü destekler. Yerleşik dönüşümler şunları içerir: daire, yuvarlak köşeler, renk filtresi kaplaması ve yeniden boyutlandırma. Dönüşümler && operatörü kullanılarak birleştirilebilir.
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]
)
Kitaplık, placeholder, ilerleme göstergesi ve hata işleme desteğiyle SwiftUI için WebImage adlı bir View bileşeni sağlar. Bileşen otomatik olarak View yaşam döngüsüne abone olur ve kaybolduğunda yüklemeyi iptal eder.
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 protokolü aracılığıyla esnek bir dönüşüm sistemi sağlar. Dönüşümler kod çözmeden sonra ancak önbelleklemeden önce uygulanır — dönüşüm sonucu diskte yeni bir anahtar altında saklanır ve sonraki isteklerde yeniden uygulanması önlenir.
Yerleşik dönüşümler şunları içerir: SDImageResizingTransformer (mode ile yeniden boyutlandırma), SDImageRoundCornerTransformer (isteğe bağlı kenarlıklı yuvarlak köşeler), SDImageFlipTransformer (yansıtma) ve SDImageFilterTransformer (CoreImage filtreleri). Birleştirme && operatörü aracılığıyla yapılır ve bir işleme zinciri oluşturur.
Özel dönüşümler için, transformedImageWithImage:forKey: yöntemiyle SDImageTransformer protokolünü uygulamak yeterlidir. Dönüşüm anahtarı otomatik olarak önbellek anahtarına eklenir ve aynı görüntünün farklı sürümleri arasında çakışmaları önler.
iOS platformunda SDWebImage'ın ana rakipleri Kingfisher (saf Swift) ve Nuke'dur. SDWebImage ve Kingfisher arasındaki seçim genellikle proje diline ve gerekli işlevselliğe göre belirlenir.
| Özellik | SDWebImage | Kingfisher |
|---|---|---|
| Dil | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Evet (yerleşik) | Evet (yerleşik) |
| WebP | Evet (eklenti) | Evet (yerleşik) |
| Aşamalı yükleme | Evet (eklentiyle) | Evet |
| Framework boyutu | ~1.2 MB | ~900 KB |
| Önbellek | Bellek + Disk | Bellek + Disk |
| CocoaPods desteği | Evet | Evet |
SDWebImage, Objective-C projeleri veya hibrit projeler için tercih edilen seçim olmaya devam etmektedir. Kingfisher, tür güvenliği ve yerel Swift sözdizimi sayesinde saf Swift projeleri için daha uygundur. Her iki kitaplık da benzer önbellek mimarisine ve performansa sahiptir.
SDWebImage, Swift Package Manager, CocoaPods veya Carthage aracılığıyla entegre edilebilir. Kitaplık modüllere ayrılmıştır: çekirdek (SDWebImage), Coder (ek formatlar) ve MapKit (MKAnnotationView için).
// Swift Paket Yöneticisi (Package.swift)
dependencies: [
.package(
url: "https://github.com/SDWebImage/SDWebImage.git",
from: "5.19.0"
)
]
// CocoaPods (Podfile)
pod 'SDWebImage', '~> 5.19.0'
// WebP ve SVG için eklentiler:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
Kurulumdan sonra kitaplık ek yapılandırma gerektirmeden kullanıma hazırdır. Önbellek özelleştirmesi için, benzersiz bir ad alanına sahip bir SDImageCache örneği oluşturun ve başlatma sırasında SDWebImageManager'a iletin. Genel yapılandırma SDWebImageManager.shared aracılığıyla yapılır.
// Önbellek özelleştirmesi
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 7 yerine 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
Sıkça sorulan sorular
SDWebImage, iOS ve macOS'ta zaman uyumsuz görüntü yükleme için bir kitaplıktır. Ağdaki görüntüleri önbelleğe alma, kod çözme, dönüştürme ve görüntüleme sorunlarını çözer ve geliştiriciyi manuel iş parçacığı ve bellek yönetiminden kurtarır.
cellForRowAt yönteminde, bir URL ve placeholder ile sd_setImage kullanın. Hücre yeniden kullanıldığında kitaplık önceki isteği otomatik olarak iptal eder. Pürüzsüz kaydırma için .progressiveLoad seçeneğini belirtin ve bağlam aracılığıyla küçük resim boyutunu yapılandırın.
SDWebImage, Swift sarmalayıcılı Objective-C ile yazılmıştır, Kingfisher ise saf Swift ile yazılmıştır. SDWebImage daha geniş bir eklenti ekosistemine (WebP, SVG, MapKit) sahiptir. Kingfisher daha iyi tür güvenliği ve Swift Concurrency entegrasyonu sağlar.
SDWebImageWebPCoder eklentisini CocoaPods veya SPM aracılığıyla yükleyin. AppDelegate'te SDImageWebPCoder.shared çağrısıyla kodlayıcıyı kaydedin. Kayıttan sonra kitaplık otomatik olarak biçimi algılar ve WebP'yi kod çözer.
Bellek için SDImageCache.shared.clearMemory() ve disk için SDImageCache.shared.clearDisk() çağrısını yapın. Yalnızca güncel olmayan dosyaları temizlemek için TTL kontrolüyle clearDisk(completion:) kullanın. calculateSizeWithCompletionBlock yöntemi geçerli önbellek boyutunu döndürür.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun