SDWebImage је библиотека за асинхроно учитавање слика на iOS и macOS-у, која пружа јединствени API за рад са мрежом, кешем и анимацијама. Према подацима званичног репозиторијума, библиотека се користи у преко 100 000 пројеката и подржава GIF, WebP, SVG и прогресивно учитавање. SDWebImage омогућуће аутоматско кеширање на диску и у меморији, као и интеграцију са UIKit и SwiftUI.
Главно
SDWebImage — библиотека за асинхроно учитавање слика на Apple платформама (iOS, macOS, tvOS, watchOS). Пружа категорију за UIImageView са методом sd_setImage, која једном линијом учитава, кешира и приказује слику из било којег извора.
Библиотека подржава прогресивно учитавање (слика се приказује како стижу бајтови), анимиране слике (GIF, APNG), трансформације (заобљавање, исецање, додавање воденог жига) и прилагођене декодере. Према GitHub Stats, SDWebImage има преко 25 хиљада звездица и користи се у великим апликацијама, укључујући Twitter, Pinterest и Instagram.
Архитектура је изграђена на ланцу компонената: Coder (декодирање), Cache (складиштење), Loader (мрежа) и Transformer (обрада). Свака компонента је замељива, што омогућуће прилагођавање библиотеке специфичним потребама пројекта.
SDWebImageManager — централна компонента која координише процес учитавања. Прима URL, проверава кеш, учитава податке, декодира их у UIImage и прослеђује у ImageView или Completion Handler. Менаџер ради кроз shared синглтон, доступан из било којег дела апликације.
Менаџер сукцесивно проверава Memory Cache (NSDictionary са UIImage), затим Disk Cache (фајл систем). Код промашаја извршава се мрежни захтев путем NSURLSession. Након учитавања, подаци се декодирају, пролазе кроз трансформације и чувају у оба кеша. Цео процес се извршава у позадинском реду, резултат се испоручује у main queue.
UIImageView+WebCache — Objective-C категорија (доступна из Swift-а), која додаје метод sd_setImage. Овај метод прима URL, placeholder, опције (SDWebImageOptions) и completion-блок. Категорија аутоматски поништава претходни захтев при поновном коришћењу ћелије табеле путем механизма sd_cancelCurrentImageLoad.
Архитектура SDWebImage је подељена на више модула са јасним зонама одговорности. Свака класа решава један задатак — од учитавања до приказивања.
SDWebImageManager — фасада за све операције са сликама. Садржи референце ка ImageCache (SDImageCache) и ImageLoader (SDWebImageDownloader). Путем делегата SDWebImageManagerDelegate може се пресрести учитавање и промијенити URL или понашање.
SDImageCache — двонивоа кеш (меморија + диск), иницијализован са јединственим namespace-ом. Memory Cache чува UIImage са конфигурабилним лимитом (подразумевано — до system memory warning). Disk Cache чува податке у директоријуму Library/Caches са конфигурабилним роком чувања (подразумевано 7 дана).
SDWebImageDownloader — HTTP клијент заснован на NSURLSession са подршком за заглавља, тајмауте и поновне покушаје. Преузимач спаја идентичне захтеве у један мрежни позив (дедупликација) и расподељује резултат између свих претплаченика.
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 | Обједињени кеш фрејмворка | Конфигурабилна величина фајлова |
При добијању 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 | Да (плагин) | Да (уграђено) |
| Прогресивно учитавање | Да (са плагином) | Да |
| Величина фрејмворка | ~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 кроз контекст.
SDWebImage је написан у Objective-C-у са Swift овојницом, 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође