SDWebImage: шта је, кључни појмови и UIImageView

Аутор: IT Sectr Објављено: 2026-05-05 Време читања: 8 мин

SDWebImage је библиотека за асинхроно учитавање слика на iOS и macOS-у, која пружа јединствени API за рад са мрежом, кешем и анимацијама. Према подацима званичног репозиторијума, библиотека се користи у преко 100 000 пројеката и подржава GIF, WebP, SVG и прогресивно учитавање. SDWebImage омогућуће аутоматско кеширање на диску и у меморији, као и интеграцију са UIKit и SwiftUI.

Главно

  • SDWebImage — библиотека за асинхроно учитавање слика на iOS-у са подршком кеширања, анимација и трансформација.
  • SDWebImageManager — централна класа која координише учитавање, декодирање и кеширање слика.
  • Disk Cache чува слике на диску, омогућућући учитавање без мреже при поновној посети.
  • WebP и GIF се подржавају кроз плагине SDImageWebPCoder и SDImageGIFCoder.
  • SwiftUI — библиотека пружа WebImage компоненту за декларативно учитавање слика.

Шта је SDWebImage?

SDWebImage — библиотека за асинхроно учитавање слика на Apple платформама (iOS, macOS, tvOS, watchOS). Пружа категорију за UIImageView са методом sd_setImage, која једном линијом учитава, кешира и приказује слику из било којег извора.

Библиотека подржава прогресивно учитавање (слика се приказује како стижу бајтови), анимиране слике (GIF, APNG), трансформације (заобљавање, исецање, додавање воденог жига) и прилагођене декодере. Према GitHub Stats, SDWebImage има преко 25 хиљада звездица и користи се у великим апликацијама, укључујући Twitter, Pinterest и Instagram.

Архитектура је изграђена на ланцу компонената: Coder (декодирање), Cache (складиштење), Loader (мрежа) и Transformer (обрада). Свака компонента је замељива, што омогућуће прилагођавање библиотеке специфичним потребама пројекта.

Како ради SDWebImage: менаџер и кеш

SDWebImageManager — централна компонента која координише процес учитавања. Прима URL, проверава кеш, учитава податке, декодира их у UIImage и прослеђује у ImageView или Completion Handler. Менаџер ради кроз shared синглтон, доступан из било којег дела апликације.

Процес учитавања

Менаџер сукцесивно проверава Memory Cache (NSDictionary са UIImage), затим Disk Cache (фајл систем). Код промашаја извршава се мрежни захтев путем NSURLSession. Након учитавања, подаци се декодирају, пролазе кроз трансформације и чувају у оба кеша. Цео процес се извршава у позадинском реду, резултат се испоручује у main queue.

  • Memory Cache — провера у O(1), чување UIImage са узимањем лимита меморије
  • Disk Cache — читање из фајл система, чување компримованих података
  • NSURLSession — учитавање са подршком HTTP/2 и конфигурабилним тајмаутом

UIImageView категорија

UIImageView+WebCache — Objective-C категорија (доступна из Swift-а), која додаје метод sd_setImage. Овај метод прима URL, placeholder, опције (SDWebImageOptions) и completion-блок. Категорија аутоматски поништава претходни захтев при поновном коришћењу ћелије табеле путем механизма sd_cancelCurrentImageLoad.

Основне класе SDWebImage

Архитектура SDWebImage је подељена на више модула са јасним зонама одговорности. Свака класа решава један задатак — од учитавања до приказивања.

SDWebImageManager

SDWebImageManager — фасада за све операције са сликама. Садржи референце ка ImageCache (SDImageCache) и ImageLoader (SDWebImageDownloader). Путем делегата SDWebImageManagerDelegate може се пресрести учитавање и промијенити URL или понашање.

SDImageCache

SDImageCache — двонивоа кеш (меморија + диск), иницијализован са јединственим namespace-ом. Memory Cache чува UIImage са конфигурабилним лимитом (подразумевано — до system memory warning). Disk Cache чува податке у директоријуму Library/Caches са конфигурабилним роком чувања (подразумевано 7 дана).

SDWebImageDownloader

SDWebImageDownloader — HTTP клијент заснован на NSURLSession са подршком за заглавља, тајмауте и поновне покушаје. Преузимач спаја идентичне захтеве у један мрежни позив (дедупликација) и расподељује резултат између свих претплаченика.

Архитектура кеширања SDWebImage

SDWebImage имплементира двонивоа кеширање са детерминистичким редоследом провере: прво меморија, затим диск. Кључ кеша је апсолутни URL слике без query параметара или MD5 хеш од њега.

НивоТип складиштењаСадржајЛимит
Memory CacheNSCache (NSDictionary)UIImage (декодирана Bitmap)До memory warning
Disk CacheФајл системNSData (JPEG/PNG/WebP)7 дана TTL (подесиво)
Auto Purge CacheMemory + DiskОбједињени кеш фрејмворкаКонфигурабилна величина фајлова

При добијању memory warning-а, iOS обавештава SDImageCache путем UIApplicationDidReceiveMemoryWarningNotification, након чега се Memory Cache потпуно брише. Disk Cache се брише према TTL-у или по прекорачењу лимита, са сортирањем фајлова по датуму последњег приступа.

За руко управљање кешом доступни су методи: clearMemory, clearDisk, calculateSize. Кеширање се може ононући за одређене захтеве кроз опцију SDWebImageCacheMemoryOnly или SDWebImageAvoidAutoSetImage.

Примери коришћења SDWebImage у Swift-у

SDWebImage пружа више интерфејса за учитавање слика: од једноставне UIImageView категорије до напредног менаџера са прилагођеном обрадом.

Основно учитавање у UIImageView

sd_setImage — главна метода за учитавање слике у UIImageView. Прима URL, placeholder и опционалне параметре кроз Options и Context. Сви Completion Handler-и се извршавају у главном ниту.

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

Метода враћа SDWebImageToken (операцију) која се може отказати ако је потребно. Унутар, sd_setImage позива SDWebImageManager.load, прослеђујући ImageView као Target за аутоматско постављање слике.

Учитавање са прилагођеном трансформацијом

SDWebImage подржава Transformer — протокол са јединим методом transformedImage. Уграђене трансформације: круг, заобљавање, наношење бојног филтра, промена величине. Комбиновање трансформација врши се оператором &&.

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

Библиотека пружа WebImage — View компоненту за SwiftUI са подршком за placeholder, индикатор напретка и обраду грешака. Компонента се аутоматски претплаћује на животни циклус View-а и отказује учитавање при нестајку.

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()
            }
        }
    }
}

Image Transformations у SDWebImage

SDWebImage пружа флексибан систем трансформација слика кроз протокол SDImageTransformer. Трансформације се примењују након декодирања, али пре кеширања — резултат трансформације се чува на диску под новим кључем, елиминишућући поновну примену при следећим захтевима.

Уграђене трансформације укључују: SDImageResizingTransformer (промена величине са режимом), SDImageRoundCornerTransformer (заобљавање углова са опционалним ивицама), SDImageFlipTransformer (огледало) и SDImageFilterTransformer (CoreImage филтри). Комбиновање се врши оператором &&, стварајући ланац обраде.

За прилагођене трансформације довољно је имплементирати протокол SDImageTransformer са методом transformedImageWithImage:forKey:. Кључ трансформације се аутоматски додаје кључу кеша, спречавајући колизије између различитих верзија исте слике.

Поређење SDWebImage са Kingfisher-ом

На iOS платформи, главни конкуренти SDWebImage су Kingfisher (чисти Swift) и Nuke. Избор између SDWebImage и Kingfisher често зависи од језика пројекта и потребне функционалности.

КарактеристикаSDWebImageKingfisher
ЈезикObjective-C + Swift APISwift (100%)
SwiftUIWebImage ViewKFImage View
GIFДа (уграђено)Да (уграђено)
WebPДа (плагин)Да (уграђено)
Прогресивно учитавањеДа (са плагином)Да
Величина фрејмворка~1.2 MB~900 KB
КешMemory + DiskMemory + Disk
Подршка CocoaPodsДаДа

SDWebImage остаје пожељни избор за пројекте у Objective-C-у или хибридне пројекте. Kingfisher је бољи избор за пројекте у чистом Swift-у због сигурности типова и изворне Swift синтаксе. Обе библиотеке имају сличну архитектуру кеширања и брзину.

Подешавање SDWebImage у iOS пројекту

Повезивање SDWebImage врши се кроз Swift Package Manager, CocoaPods или Carthage. Библиотека је подељена на модуле: главни (SDWebImage), Coder (додатни формати) и MapKit (за MKAnnotationView).

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 и SVG:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'

Након инсталације, библиотека је спремна за коришћење без додатне конфигурације. За прилагођавање кеша креира се инстанца SDImageCache са јединственим namespace-ом, која се прослеђује SDWebImageManager-у при иницијализацији. Глобална конфигурација се врши кроз SDWebImageManager.shared.

swift
// Прилагођавање кеша
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 и које задатке решава?

SDWebImage — библиотека за асинхроно учитавање слика на iOS и macOS-у. Решава задатке кеширања, декодирања, трансформације и приказивања слика из мреже, ослобађајући програмера од ручног управљања нитима и меморијом.

Како користити SDWebImage са UITableView?

У методи cellForRowAt користите sd_setImage са URL и placeholder-ом. Библиотека аутоматски поништава претходни захтев при поновном коришћењу ћелије. За глатко скроловање наведите опцију .progressiveLoad и подесите величину thumbnail кроз контекст.

По чему се SDWebImage разликује од Kingfisher-а?

SDWebImage је написан у Objective-C-у са Swift овојницом, Kingfisher — у чистом Swift-у. SDWebImage има шири екосистем плагина (WebP, SVG, MapKit). Kingfisher пружа бољу сигурност типова и интеграцију са Swift Concurrency.

Како додати подршку за WebP у SDWebImage?

Инсталирајте плагин SDWebImageWebPCoder путем CocoaPods или SPM-а. Региструјте кодер позивом SDImageWebPCoder.shared у AppDelegate-у. Након регистрације, библиотека аутоматски препознаје формат и декодира WebP.

Како програмски очистити SDWebImage кеш?

Позовите SDImageCache.shared.clearMemory() за меморију и SDImageCache.shared.clearDisk() за диск. За брисање само застарелих фајлова користите clearDisk(completion:) са провером TTL-а. Метода calculateSizeWithCompletionBlock враћа тренутну величину кеша.

Закључак

  • SDWebImage — де-факто стандард за учитавање слика на iOS-у са преко 25 хиљада звездица на GitHub-у.
  • Двонивоа кеш (Memory + Disk) омогућуће тренутно учитавање поновних слика и офлајн приступ.
  • Прогресивно учитавање и подршка за GIF, WebP, SVG чине библиотеку универзалним решењем за било који формат.
  • SDWebImageManager пружа јединствену фасаду за учитавање са могућношћу прилагођавања сваке компоненте.
  • WebImage за SwiftUI омогућуће учитавање слика у декларативном стилу са обрадом свих стања.
  • Трансформације (величина, заобљавање, боја) се комбинују оператором && и извршавају пре кеширања.
  • Компатибилност са Objective-C-ом чини SDWebImage доступним за legacy пројекте без преласка на Swift.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође