SDWebImage is een bibliotheek voor asynchroon laden van afbeeldingen op iOS en macOS, die een uniforme API biedt voor het werken met netwerk, cache en animaties. Volgens gegevens van de officiële repository wordt de bibliotheek gebruikt in meer dan 100.000 projecten en ondersteunt het GIF, WebP, SVG en progressief laden. SDWebImage zorgt voor automatische caching op schijf en in geheugen, evenals integratie met UIKit en SwiftUI.
Belangrijkste punten
SDWebImage — bibliotheek voor asynchroon laden van afbeeldingen op Apple-platforms (iOS, macOS, tvOS, watchOS). Het biedt een categorie voor UIImageView met de methode sd_setImage die in één regel een afbeelding uit elke bron laadt, cached en weergeeft.
De bibliotheek ondersteunt progressief laden (de afbeelding wordt weergegeven naarmate bytes binnenkomen), geanimeerde afbeeldingen (GIF, APNG), transformaties (afronden, bijsnijden, watermerk toevoegen) en aangepaste decoders. Volgens GitHub Stats heeft SDWebImage meer dan 25.000 sterren en wordt het gebruikt in grote apps zoals Twitter, Pinterest en Instagram.
De architectuur is gebaseerd op een keten van componenten: Coder (decoderen), Cache (opslag), Loader (netwerk) en Transformer (verwerking). Elk component is vervangbaar, waardoor de bibliotheek kan worden aangepast aan specifieke projectvereisten.
SDWebImageManager — centrale component die het laadproces coördineert. Het ontvangt een URL, controleert de cache, laadt gegevens, decodeert ze naar UIImage en stuurt ze door naar ImageView of Completion Handler. De manager werkt via de shared singleton, toegankelijk vanuit elk deel van de applicatie.
De manager controleert achtereenvolgens Memory Cache (NSDictionary met UIImage), daarna Disk Cache (bestandssysteem). Bij een misser wordt een netwerkverzoek uitgevoerd via NSURLSession. Na het laden worden de gegevens gedecodeerd, doorlopen ze transformaties en worden ze opgeslagen in beide caches. Het hele proces vindt plaats op de achtergrond, het resultaat wordt afgeleverd in de main queue.
UIImageView+WebCache — Objective-C-categorie (toegankelijk vanuit Swift) die de methode sd_setImage toevoegt. Deze methode accepteert URL, placeholder, opties (SDWebImageOptions) en een completion-block. De categorie annuleert automatisch het vorige verzoek bij hergebruik van een tabelcel via het mechanisme sd_cancelCurrentImageLoad.
De architectuur van SDWebImage is verdeeld in meerdere modules met duidelijke verantwoordelijkheidsgebieden. Elke klasse lost één taak op — van laden tot weergave.
SDWebImageManager — facade voor alle bewerkingen met afbeeldingen. Bevat verwijzingen naar ImageCache (SDImageCache) en ImageLoader (SDWebImageDownloader). Via de delegate SDWebImageManagerDelegate kan het laden worden onderschept en de URL of het gedrag worden gewijzigd.
SDImageCache — tweetraps cache (memory + disk), geïnitialiseerd met een unieke namespace. Memory Cache slaat UIImage op met een configureerbare limiet (standaard — tot system memory warning). Disk Cache slaat gegevens op in de directory Library/Caches met een configureerbare bewaartermijn (standaard 7 dagen).
SDWebImageDownloader — HTTP-client gebaseerd op NSURLSession met ondersteuning voor headers, timeouts en herhaalpogingen. De downloader combineert identieke verzoeken in één netwerkaanroep (deduplicatie) en verdeelt het resultaat onder alle abonnees.
SDWebImage implementeert tweetraps caching met een deterministische controle-order: eerst geheugen, dan schijf. De cachesleutel is de absolute URL van de afbeelding zonder queryparameters of de MD5-hash ervan.
| Niveau | Opslagtype | Inhoud | Limiet |
|---|---|---|---|
| Memory Cache | NSCache (NSDictionary) | UIImage (gedecodeerde Bitmap) | Tot memory warning |
| Disk Cache | Bestandssysteem | NSData (JPEG/PNG/WebP) | 7 dagen TTL (configureerbaar) |
| Auto Purge Cache | Memory + Disk | Gecombineerde cache van framework | Configureerbare bestandsgrootte |
Bij ontvangst van een memory warning stelt iOS SDImageCache op de hoogte via UIApplicationDidReceiveMemoryWarningNotification, waarna Memory Cache volledig wordt gewist. Disk Cache wordt gewist op basis van TTL of bij overschrijding van de limiet, met sortering van bestanden op datum van laatste toegang.
Voor handmatig cachebeheer zijn methoden beschikbaar: clearMemory, clearDisk, calculateSize. Caching kan voor specifieke verzoeken worden uitgeschakeld via de opties SDWebImageCacheMemoryOnly of SDWebImageAvoidAutoSetImage.
SDWebImage biedt meerdere interfaces voor het laden van afbeeldingen: van een eenvoudige UIImageView-categorie tot een geavanceerde manager met aangepaste verwerking.
sd_setImage — de belangrijkste methode voor het laden van een afbeelding in UIImageView. Het accepteert URL, placeholder en optionele parameters via Options en Context. Alle Completion Handlers worden uitgevoerd in de hoofdthread.
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)]
)
De methode retourneert SDWebImageToken (een bewerking) die indien nodig kan worden geannuleerd. Intern roept sd_setImage SDWebImageManager.load aan, waarbij ImageView als Target wordt doorgegeven voor het automatisch instellen van de afbeelding.
SDWebImage ondersteunt Transformer — een protocol met een enkele methode transformedImage. Ingebouwde transformaties: cirkel, afronding, toepassen van kleurenfilter, formaat wijzigen. Combineren van transformaties gebeurt met de operator &&.
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]
)
De bibliotheek biedt WebImage — een View-component voor SwiftUI met ondersteuning voor placeholder, voortgangsindicator en foutafhandeling. De component abonneert zich automatisch op de levenscyclus van de View en annuleert het laden bij verdwijnen.
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 biedt een flexibel systeem voor afbeeldingstransformaties via het protocol SDImageTransformer. Transformaties worden toegepast na decodering maar vóór caching — het transformatieresultaat wordt op schijf opgeslagen onder een nieuwe sleutel, waardoor herhaalde toepassing bij volgende verzoeken wordt voorkomen.
Ingebouwde transformaties omvatten: SDImageResizingTransformer (formaat wijzigen met modus), SDImageRoundCornerTransformer (hoeken afronden met optionele rand), SDImageFlipTransformer (spiegelen) en SDImageFilterTransformer (CoreImage-filters). Combineren gebeurt met de operator &&, waardoor een verwerkingsketen ontstaat.
Voor aangepaste transformaties volstaat het implementeren van het protocol SDImageTransformer met de methode transformedImageWithImage:forKey:. De transformatiesleutel wordt automatisch toegevoegd aan de cachesleutel, waardoor conflicten tussen verschillende versies van dezelfde afbeelding worden voorkomen.
Op het iOS-platform zijn de belangrijkste concurrenten van SDWebImage Kingfisher (puur Swift) en Nuke. De keuze tussen SDWebImage en Kingfisher hangt vaak af van de projecttaal en de gewenste functionaliteit.
| Kenmerk | SDWebImage | Kingfisher |
|---|---|---|
| Taal | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Ja (ingebouwd) | Ja (ingebouwd) |
| WebP | Ja (plug-in) | Ja (ingebouwd) |
| Progressief laden | Ja (met plug-in) | Ja |
| Framework grootte | ~1.2 MB | ~900 KB |
| Cache | Memory + Disk | Memory + Disk |
| CocoaPods ondersteuning | Ja | Ja |
SDWebImage blijft de voorkeurskeuze voor projecten in Objective-C of hybride projecten. Kingfisher is geschikter voor pure Swift-projecten vanwege typeveiligheid en native Swift-syntax. Beide bibliotheken hebben een vergelijkbare cache-architectuur en snelheid.
Het aansluiten van SDWebImage gebeurt via Swift Package Manager, CocoaPods of Carthage. De bibliotheek is verdeeld in modules: hoofd (SDWebImage), Coder (extra formaten) en MapKit (voor MKAnnotationView).
// 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'
// Plug-ins voor WebP en SVG:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
Na installatie is de bibliotheek klaar voor gebruik zonder verdere configuratie. Voor het aanpassen van de cache wordt een exemplaar van SDImageCache gemaakt met een unieke namespace, die wordt doorgegeven aan SDWebImageManager bij initialisatie. Globale configuratie gebeurt via SDWebImageManager.shared.
// Cache aanpassen
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 14 dagen in plaats van 7
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
Veelgestelde vragen
SDWebImage — bibliotheek voor asynchroon laden van afbeeldingen op iOS en macOS. Het lost taken op van caching, decodering, transformatie en weergave van afbeeldingen uit het netwerk, waardoor de ontwikkelaar wordt bevrijd van handmatig thread- en geheugenbeheer.
Gebruik in de methode cellForRowAt sd_setImage met URL en placeholder. De bibliotheek annuleert automatisch het vorige verzoek bij hergebruik van de cel. Geef voor vloeiend scrollen de optie .progressiveLoad op en configureer de thumbnail-grootte via context.
SDWebImage is geschreven in Objective-C met een Swift-wrapper, Kingfisher in puur Swift. SDWebImage heeft een breder plug-inecosysteem (WebP, SVG, MapKit). Kingfisher biedt betere typeveiligheid en integratie met Swift Concurrency.
Installeer de plug-in SDWebImageWebPCoder via CocoaPods of SPM. Registreer de coder door SDImageWebPCoder.shared aan te roepen in AppDelegate. Na registratie detecteert de bibliotheek automatisch het formaat en decodeert WebP.
Roep SDImageCache.shared.clearMemory() aan voor geheugen en SDImageCache.shared.clearDisk() voor schijf. Gebruik voor het wissen van alleen verouderde bestanden clearDisk(completion:) met TTL-controle. De methode calculateSizeWithCompletionBlock retourneert de huidige cachegrootte.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook