SDWebImage es una biblioteca para la carga asíncrona de imágenes en iOS y macOS, que proporciona una API unificada para trabajar con la red, el caché y las animaciones. Según el repositorio oficial, la biblioteca se utiliza en más de 100.000 proyectos y admite GIF, WebP, SVG y carga progresiva. SDWebImage proporciona almacenamiento en caché automático en disco y memoria, así como integración con UIKit y SwiftUI.
Puntos clave
SDWebImage es una biblioteca para la carga asíncrona de imágenes en plataformas Apple (iOS, macOS, tvOS, watchOS). Proporciona una categoría para UIImageView con el método sd_setImage, que carga, almacena en caché y muestra una imagen desde cualquier fuente en una sola línea de código.
La biblioteca admite carga progresiva (la imagen aparece a medida que se reciben los bytes), imágenes animadas (GIF, APNG), transformaciones (redondeo, recorte, marcas de agua) y decodificadores personalizados. Según GitHub Stats, SDWebImage tiene más de 25.000 estrellas y se utiliza en aplicaciones importantes, incluyendo Twitter, Pinterest e Instagram.
La arquitectura se basa en una cadena de componentes: Coder (decodificación), Cache (almacenamiento), Loader (red) y Transformer (procesamiento). Cada componente es reemplazable, lo que permite adaptar la biblioteca a los requisitos específicos del proyecto.
SDWebImageManager es el componente central que coordina el proceso de carga. Acepta una URL, verifica el caché, carga los datos, los decodifica en UIImage y los pasa a ImageView o Completion Handler. El gestor funciona a través de un singleton compartido, accesible desde cualquier parte de la aplicación.
El gestor verifica secuencialmente el Memory Cache (NSDictionary con UIImage), luego el Disk Cache (sistema de archivos). En caso de fallo, se realiza una solicitud de red a través de NSURLSession. Después de la carga, los datos se decodifican, pasan por transformaciones y se guardan en ambos cachés. Todo el proceso se ejecuta en una cola en segundo plano y los resultados se entregan en la cola principal.
UIImageView+WebCache es una categoría de Objective-C (accesible desde Swift) que añade el método sd_setImage. Este método acepta una URL, placeholder, opciones (SDWebImageOptions) y un bloque de finalización. La categoría cancela automáticamente la solicitud anterior cuando se reutiliza una celda de tabla a través del mecanismo sd_cancelCurrentImageLoad.
La arquitectura de SDWebImage se divide en varios módulos con zonas de responsabilidad claras. Cada clase resuelve una tarea, desde la carga hasta la visualización.
SDWebImageManager es la fachada para todas las operaciones con imágenes. Contiene referencias a ImageCache (SDImageCache) e ImageLoader (SDWebImageDownloader). A través del delegado SDWebImageManagerDelegate, se puede interceptar la carga y cambiar la URL o el comportamiento.
SDImageCache es un caché de dos niveles (memoria + disco) inicializado con un namespace único. Memory Cache almacena UIImage con un límite configurable (por defecto, hasta que se recibe una advertencia de memoria del sistema). Disk Cache almacena datos en el directorio Library/Caches con una duración de almacenamiento configurable (por defecto 7 días).
SDWebImageDownloader es un cliente HTTP basado en NSURLSession con soporte para cabeceras, tiempos de espera y reintentos. El descargador desduplica solicitudes idénticas en una única llamada de red y distribuye el resultado entre todos los suscriptores.
SDWebImage implementa un caché de dos niveles con un orden de verificación determinista: primero memoria, luego disco. La clave de caché es la URL absoluta de la imagen sin parámetros de consulta o su hash MD5.
| Nivel | Tipo de almacenamiento | Contenido | Límite |
|---|---|---|---|
| Memory Cache | NSCache (NSDictionary) | UIImage (Bitmap decodificado) | Hasta advertencia de memoria |
| Disk Cache | Sistema de archivos | NSData (JPEG/PNG/WebP) | 7 días TTL (configurable) |
| Auto Purge Cache | Memoria + Disco | Caché combinado del framework | Tamaño de archivo configurable |
Al recibir una advertencia de memoria, iOS notifica a SDImageCache a través de UIApplicationDidReceiveMemoryWarningNotification, tras lo cual el Memory Cache se limpia por completo. El Disk Cache se limpia por TTL o cuando se supera el límite, ordenando los archivos por fecha del último acceso.
Para la gestión manual del caché, están disponibles los siguientes métodos: clearMemory, clearDisk, calculateSize. El caché se puede desactivar para solicitudes específicas mediante las opciones SDWebImageCacheMemoryOnly o SDWebImageAvoidAutoSetImage.
SDWebImage proporciona varias interfaces para cargar imágenes: desde la simple categoría UIImageView hasta el gestor avanzado con procesamiento personalizado.
sd_setImage es el método principal para cargar una imagen en UIImageView. Acepta una URL, placeholder y parámetros opcionales a través de Options y Context. Todos los Completion Handler se ejecutan en el hilo principal.
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)]
)
El método devuelve un SDWebImageToken (operación) que se puede cancelar si es necesario. Internamente, sd_setImage llama a SDWebImageManager.load, pasando ImageView como Target para el establecimiento automático de la imagen.
SDWebImage admite Transformer — un protocolo con un único método transformedImage. Las transformaciones integradas incluyen: círculo, esquinas redondeadas, superposición de filtro de color y cambio de tamaño. Las transformaciones se pueden combinar usando el operador &&.
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]
)
La biblioteca proporciona WebImage — un componente View para SwiftUI con soporte para placeholder, indicador de progreso y manejo de errores. El componente se suscribe automáticamente al ciclo de vida de la View y cancela la carga cuando desaparece.
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 proporciona un sistema flexible de transformaciones a través del protocolo SDImageTransformer. Las transformaciones se aplican después de la decodificación pero antes del almacenamiento en caché — el resultado de la transformación se guarda en disco bajo una nueva clave, evitando la reaplicación en solicitudes posteriores.
Las transformaciones integradas incluyen: SDImageResizingTransformer (cambio de tamaño con mode), SDImageRoundCornerTransformer (esquinas redondeadas con borde opcional), SDImageFlipTransformer (reflejo) y SDImageFilterTransformer (filtros CoreImage). La combinación se realiza mediante el operador &&, creando una cadena de procesamiento.
Para transformaciones personalizadas, basta con implementar el protocolo SDImageTransformer con el método transformedImageWithImage:forKey:. La clave de transformación se añade automáticamente a la clave de caché, evitando colisiones entre diferentes versiones de la misma imagen.
En la plataforma iOS, los principales competidores de SDWebImage son Kingfisher (Swift puro) y Nuke. La elección entre SDWebImage y Kingfisher a menudo viene determinada por el lenguaje del proyecto y la funcionalidad requerida.
| Característica | SDWebImage | Kingfisher |
|---|---|---|
| Lenguaje | Objective-C + Swift API | Swift (100%) |
| SwiftUI | WebImage View | KFImage View |
| GIF | Sí (integrado) | Sí (integrado) |
| WebP | Sí (plugin) | Sí (integrado) |
| Carga progresiva | Sí (con plugin) | Sí |
| Tamaño del framework | ~1.2 MB | ~900 KB |
| Caché | Memoria + Disco | Memoria + Disco |
| Soporte CocoaPods | Sí | Sí |
SDWebImage sigue siendo la opción preferida para proyectos en Objective-C o proyectos híbridos. Kingfisher es más adecuado para proyectos en Swift puro gracias a la seguridad de tipos y la sintaxis nativa de Swift. Ambas bibliotecas tienen una arquitectura de caché y un rendimiento similares.
SDWebImage se puede integrar a través de Swift Package Manager, CocoaPods o Carthage. La biblioteca está dividida en módulos: principal (SDWebImage), Coder (formatos adicionales) y MapKit (para 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'
// Plugins para WebP y SVG:
pod 'SDWebImageWebPCoder'
pod 'SDWebImageSVGCoder'
Después de la instalación, la biblioteca está lista para usar sin configuración adicional. Para personalizar el caché, crea una instancia de SDImageCache con un namespace único y pásala a SDWebImageManager durante la inicialización. La configuración global se realiza a través de SDWebImageManager.shared.
// Personalización del caché
let config = SDImageCacheConfig()
config.maxDiskAge = 14 * 86400 // 14 días en lugar de 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
Preguntas frecuentes
SDWebImage es una biblioteca para la carga asíncrona de imágenes en iOS y macOS. Resuelve los problemas de almacenamiento en caché, decodificación, transformación y visualización de imágenes desde la red, liberando al desarrollador de la gestión manual de hilos y memoria.
En el método cellForRowAt, usa sd_setImage con una URL y placeholder. La biblioteca cancela automáticamente la solicitud anterior cuando se reutiliza la celda. Para un desplazamiento suave, especifica la opción .progressiveLoad y configura el tamaño del thumbnail a través del contexto.
SDWebImage está escrito en Objective-C con un envoltorio Swift, mientras que Kingfisher está escrito en Swift puro. SDWebImage tiene un ecosistema de plugins más amplio (WebP, SVG, MapKit). Kingfisher proporciona mejor seguridad de tipos e integración con Swift Concurrency.
Instala el plugin SDWebImageWebPCoder a través de CocoaPods o SPM. Registra el codificador llamando a SDImageWebPCoder.shared en AppDelegate. Después del registro, la biblioteca detecta automáticamente el formato y decodifica WebP.
Llama a SDImageCache.shared.clearMemory() para la memoria y SDImageCache.shared.clearDisk() para el disco. Para limpiar solo los archivos obsoletos, usa clearDisk(completion:) con verificación de TTL. El método calculateSizeWithCompletionBlock devuelve el tamaño actual del caché.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también