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 singleton, достъпен от всяка точка на приложението.
Мениджърът последователно проверява 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 — двустепенен кеш (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 чрез контекст.
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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също