Το SDWebImage είναι μια βιβλιοθήκη για ασύγχρονη φόρτωση εικόνων σε iOS και macOS, παρέχοντας ένα ενιαίο API για εργασία με δίκτυο, προσωρινή αποθήκευση και κινούμενα σχέδια. Σύμφωνα με τα δεδομένα του επίσημου αποθετηρίου, η βιβλιοθήκη χρησιμοποιείται σε πάνω από 100.000 έργα και υποστηρίζει GIF, WebP, SVG και προοδευτική φόρτωση. Το SDWebImage παρέχει αυτόματη προσωρινή αποθήκευση στο δίσκο και στη μνήμη, καθώς και ενσωμάτωση με UIKit και SwiftUI.
Βασικά σημεία
SDWebImage — βιβλιοθήκη για ασύγχρονη φόρτωση εικόνων σε πλατφόρμες Apple (iOS, macOS, tvOS, watchOS). Παρέχει μια κατηγορία για UIImageView με τη μέθοδο sd_setImage που σε μία γραμμή φορτώνει, αποθηκεύει προσωρινά και εμφανίζει την εικόνα από οποιαδήποτε πηγή.
Η βιβλιοθήκη υποστηρίζει προοδευτική φόρτωση (η εικόνα εμφανίζεται καθώς λαμβάνει bytes), κινούμενες εικόνες (GIF, APNG), μετασχηματισμούς (στρογγυλοποίηση, περικοπή, προσθήκη υδατοσήμου) και προσαρμοσμένους αποκωδικοποιητές. Σύμφωνα με GitHub Stats, το SDWebImage έχει πάνω από 25 χιλιάδες αστέρια και χρησιμοποιείται σε μεγάλες εφαρμογές, συμπεριλαμβανομένων των Twitter, Pinterest και Instagram.
Η αρχιτεκτονική βασίζεται σε μια αλυσίδα στοιχείων: Coder (αποκωδικοποίηση), Cache (αποθήκευση), Loader (δίκτυο) και Transformer (επεξεργασία). Κάθε στοιχείο είναι αντικαταστάσιμο, επιτρέποντας την προσαρμογή της βιβλιοθήκης σε ειδικές απαιτήσεις του έργου.
SDWebImageManager — το κεντρικό στοιχείο που συντονίζει τη διαδικασία φόρτωσης. Λαμβάνει URL, ελέγχει την προσωρινή αποθήκευση, φορτώνει τα δεδομένα, τα αποκωδικοποιεί σε UIImage και τα μεταβιβάζει στο ImageView ή στο Completion Handler. Ο διαχειριστής λειτουργεί μέσω του shared singleton, προσβάσιμος από οποιοδήποτε σημείο της εφαρμογής.
Ο διαχειριστής ελέγχει διαδοχικά την Memory Cache (NSDictionary με UIImage), έπειτα τη Disk Cache (σύστημα αρχείων). Σε περίπτωση απουσίας δεδομένων, εκτελείται μια αίτηση δικτύου μέσω NSURLSession. Μετά τη φόρτωση, τα δεδομένα αποκωδικοποιούνται, περνούν μέσα από μετασχηματισμούς και αποθηκεύονται και στις δύο προσωρινές αποθηκεύσεις. Ολόκληρη η διαδικασία εκτελείται σε ουρά υπόβαθρου, το αποτέλεσμα παραδίδεται στην main queue.
UIImageView+WebCache — κατηγορία Objective-C (προσβάσιμη από Swift) που προσθέτει τη μέθοδο sd_setImage. Αυτή η μέθοδος δέχεται URL, placeholder, επιλογές (SDWebImageOptions) και completion-block. Η κατηγορία ακυρώνει αυτόματα το προηγούμενο αίτημα κατά την επαναχρησιμοποίηση κελιού πίνακα μέσω του μηχανισμού sd_cancelCurrentImageLoad.
Η αρχιτεκτονική του SDWebImage χωρίζεται σε πολλά δομήματα με σαφείς περιοχές ευθύνης. Κάθε κλάση λύνει ένα φύλλο εργασίας — από τη φόρτωση μέχρι την εμφάνιση.
SDWebImageManager — πρόσοψη για όλες τις λειτουργίες με εικόνες. Περιέχει αναφορές σε ImageCache (SDImageCache) και ImageLoader (SDWebImageDownloader). Μέσω του αποσταλμένου SDWebImageManagerDelegate μπορεί να παρακολουθηθεί η φόρτωση και να τροποποιηθεί το URL ή η συμπεριφορά.
SDImageCache — αποθήκευση δύο επιπέδων (memory + disk), αρχικοποιημένη με μοναδικό namespace. Η Memory Cache αποθηκεύει UIImage με διαμορφώσιμο όριο (από προκαθορισμού — μέχρι system memory warning). Η Disk Cache αποθηκεύει δεδομένα στον κατάλογο Library/Caches με διαμορφώσιμη περίοδο αποθήκευσης (από προκαθορισμού 7 ημέρες).
SDWebImageDownloader — πελάτης HTTP βασισμένος σε NSURLSession με υποστήριξη κεφαλίδων, timeout και επαναλήψεων. Ο λήπτης συνδυάζει παρόμοια αιτήματα σε μία κλήση δικτύου (αφαίρεση διπλοτύπων) και κατανέμει το αποτέλεσμα σε όλους τους συνδρομητές.
Το SDWebImage υλοποιεί προσωρινή αποθήκευση δύο επιπέδων με ντετερμινιστική σειρά ελέγχου: πρώτα μνήμη, μετά δίσκος. Το κλειδί προσωρινής αποθήκευσης είναι το απόλυτο URL της εικόνας χωρίς παραμέτρους query ή το MD5 χας του.
| Επίπεδο | Τύπος αποθήκευσης | Περιεχόμενο | Όριο |
|---|---|---|---|
| Memory Cache | NSCache (NSDictionary) | UIImage (αποκωδικοποιημένο Bitmap) | Μέχρι memory warning |
| Disk Cache | Σύστημα αρχείων | NSData (JPEG/PNG/WebP) | 7 ημέρες TTL (διαμορφώσιμο) |
| Auto Purge Cache | Memory + Disk | Συνδυασμένη προσωρινή αποθήκευση framework | Διαμορφώσιμο μέγεθος αρχείου |
Όταν λαμβάνει memory warning, το iOS ειδοποιεί το SDImageCache μέσω UIApplicationDidReceiveMemoryWarningNotification, οπότε η Memory Cache καθαρίζεται πλήρως. Η Disk Cache καθαρίζεται βάσει TTL ή όταν υπερβαίνεται το όριο, με ταξινόμηση των αρχείων βάσει ημερομηνίας τελευταίας πρόσβασης.
Για χειροκίνητη διαχείριση προσωρινής αποθήκευσης διατίθενται μέθοδοι: clearMemory, clearDisk, calculateSize. Η προσωρινή αποθήκευση μπορεί να απενεργοποιηθεί για συγκεκριμένα αιτήματα μέσω της επιλογής SDWebImageCacheMemoryOnly ή SDWebImageAvoidAutoSetImage.
Το SDWebImage παρέχει πολλές διεπαφές για φόρτωση εικόνων: από την απλή κατηγορία UIImageView μέχρι τον προηγμένο διαχειριστή με προσαρμοσμένη επεξεργασία.
sd_setImage — η κύρια μέθοδος για φόρτωση εικόνας σε UIImageView. Δέχεται URL, placeholder και προαιρετικές παραμέτρους μέσω Options και Context. Όλοι οι Completion Handler εκτελούνται στο κύριο νήμα.
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)]
)
Η μέθοδος επιστρέφει SDWebImageToken (μια λειτουργία) που μπορεί να ακυρωθεί εάν χρειαστεί. Εσωτερικά, η sd_setImage καλεί την SDWebImageManager.load, μεταβιβάζοντας το ImageView ως Target για αυτόματη ρύθμιση της εικόνας.
Το SDWebImage υποστηρίζει Transformer — ένα πρωτόκολλο με μία μοναδική μέθοδο transformedImage. Ενσωματωμένοι μετασχηματισμοί: κύκλος, στρογγυλοποίηση, εφαρμογή φίλτρου χρώματος, αλλαγή μεγέθους. Ο συνδυασμός μετασχηματισμών γίνεται με τον τελεστή &&.
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]
)
Η βιβλιοθήκη παρέχει WebImage — ένα στοιχείο View για SwiftUI με υποστήριξη placeholder, δείκτη προόδου και χειρισμού σφαλμάτων. Το στοιχείο εγγράφεται αυτόματα στον κύκλο ζωής του View και ακυρώνει τη φόρτωση κατά την εξαφάνιση.
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. Οι μετασχηματισμοί εφαρμόζονται μετά την αποκωδικοποίηση αλλά πριν την προσωρινή αποθήκευση — το αποτέλεσμα του μετασχηματισμού αποθηκεύεται στο δίσκο με νέο κλειδί, αποτρέποντας την επαναλαμβανόμενη εφαρμογή σε μελλοντικά αιτήματα.
Οι ενσωματωμένοι μετασχηματισμοί περιλαμβάνουν: SDImageResizingTransformer (αλλαγή μεγέθους με λειτουργία), SDImageRoundCornerTransformer (στρογγυλοποίηση γωνιών με προαιρετικό σύνορο), SDImageFlipTransformer (κατοπτρισμός) και SDImageFilterTransformer (φίλτρα CoreImage). Ο συνδυασμός γίνεται με τον τελεστή &&, δημιουργώντας μια αλυσίδα επεξεργασίας.
Για προσαρμοσμένους μετασχηματισμούς, αρκεί η υλοποίηση του πρωτοκόλλου SDImageTransformer με τη μέθοδο transformedImageWithImage:forKey:. Το κλειδί μετασχηματισμού προστίθεται αυτόματα στο κλειδί προσωρινής αποθήκευσης, αποτρέποντας συγκρούσεις μεταξύ διαφορετικών εκδόσεων της ίδιας εικόνας.
Στην πλατφόρμα iOS, οι κύριοι ανταγωνιστές του SDWebImage είναι Kingfisher (καθαρό Swift) και Nuke. Η επιλογή ανάμεσα σε SDWebImage και Kingfisher συχνά εξαρτάται από τη γλώσσα του έργου και την απαιτούμενη λειτουργικότητα.
| Χαρακτηριστικό | SDWebImage | Kingfisher |
|---|---|---|
| Γλώσσα | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Ναι (ενσωματωμένο) | Ναι (ενσωματωμένο) |
| WebP | Ναι (πρόσθετο) | Ναι (ενσωματωμένο) |
| Προοδευτική φόρτωση | Ναι (με πρόσθετο) | Ναι |
| Μέγεθος framework | ~1.2 MB | ~900 KB |
| Προσωρινή αποθήκευση | Memory + Disk | Memory + Disk |
| Υποστήριξη CocoaPods | Ναι | Ναι |
Το SDWebImage παραμένει η προτιμημένη επιλογή για έργα σε Objective-C ή υβριδικά έργα. Το Kingfisher είναι κατάλληλο για έργα σε καθαρό Swift χάρη στην ασφάλεια τύπων και την εγγενή σύνταξη Swift. Και οι δύο βιβλιοθήκες έχουν παρόμοια αρχιτεκτονική προσωρινής αποθήκευσης και ταχύτητα.
Η σύνδεση του SDWebImage γίνεται μέσω Swift Package Manager, CocoaPods ή Carthage. Η βιβλιοθήκη χωρίζεται σε δομήματα: κύριο (SDWebImage), Coder (πρόσθετες μορφές) και MapKit (για 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'
// Πρόσθετα για WebP και SVG:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
Μετά την εγκατάσταση, η βιβλιοθήκη είναι έτοιμη για χρήση χωρίς πρόσθετη ρύθμιση. Για προσαρμογή της προσωρινής αποθήκευσης, δημιουργείται ένα στέλεχος SDImageCache με μοναδικό namespace, το οποίο μεταβιβάζεται στο SDWebImageManager κατά την αρχικοποίηση. Η συνολική παραμετροποίηση γίνεται μέσω SDWebImageManager.shared.
// Προσαρμογή προσωρινής αποθήκευσης
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 14 ημέρες αντί για 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
Συχνές Ερωτήσεις
SDWebImage — βιβλιοθήκη για ασύγχρονη φόρτωση εικόνων σε iOS και macOS. Λύνει τα καθήκοντα προσωρινής αποθήκευσης, αποκωδικοποίησης, μετασχηματισμού και εμφάνισης εικόνων από το δίκτυο, απελευθερώνοντας τον προγραμματιστή από τη χειροκίνητη διαχείριση νημάτων και μνήμης.
Στη μέθοδο cellForRowAt χρησιμοποιήστε sd_setImage με URL και placeholder. Η βιβλιοθήκη ακυρώνει αυτόματα το προηγούμενο αίτημα κατά την επαναχρησιμοποίηση κελιού. Για ομαλή κύλιση, καθορίστε την επιλογή .progressiveLoad και ρυθμίστε το μέγεθος thumbnail μέσω του context.
SDWebImage είναι γραμμένο σε Objective-C με Swift wrapper, το Kingfisher σε καθαρό Swift. Το SDWebImage έχει ευρύτερο οικοσύστημα προσθέτων (WebP, SVG, MapKit). Το Kingfisher παρέχει καλύτερη ασφάλεια τύπων και ενσωμάτωση με Swift Concurrency.
Εγκαταστήστε το πρόσθετο SDWebImageWebPCoder μέσω CocoaPods ή SPM. Καταχωρήστε τον αποκωδικοποιητή καλώντας SDImageWebPCoder.shared στο AppDelegate. Μετά την καταχώρηση, η βιβλιοθήκη εντοπίζει αυτόματα τη μορφή και αποκωδικοποιεί το WebP.
Καλέστε SDImageCache.shared.clearMemory() για τη μνήμη και SDImageCache.shared.clearDisk() για το δίσκο. Για εκκαθάριση μόνο παλιών αρχείων, χρησιμοποιήστε clearDisk(completion:) με έλεγχο TTL. Η μέθοδος calculateSizeWithCompletionBlock επιστρέφει το τρέχον μέγεθος της προσωρινής αποθήκευσης.
Συμπεράσματα
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης