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 — двухуровневый кэш (memory + disk), инициализируемый с уникальным namespace. Memory Cache хранит UIImage с конфигурируемым лимитом (по умолчанию — до вытеснения system memory warning). Disk Cache хранит данные в директории Library/Caches с настраиваемым сроком хранения (по умолчанию 7 дней).
SDWebImageDownloader — HTTP-клиент на основе NSURLSession с поддержкой заголовков, таймаутов и повторных попыток. Загрузчик объединяет одинаковые запросы в один сетевой вызов (deduplication) и распределяет результат между всеми подписчиками.
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 (изменение размера с mode), 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также