2011-05-19 15 views
44

estoy usando la biblioteca SDWebImage de imágenes web de caché en mi aplicación:¿Qué sucede con SDWebImage Cached Images en mi aplicación cuando cambia el archivo de imagen en el servidor?

https://github.com/rs/SDWebImage/blob/master/README.md

Uso actual:

[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

Mi pregunta es ¿qué sucede una vez que la imagen se ha almacenado en caché y luego un par de días más tarde ese archivo de imagen en el servidor se ha actualizado con una nueva imagen?

Por el momento, mi aplicación sigue mostrando la imagen en caché.

No puedo ver en ninguno de los documentos sobre la configuración de un tiempo de espera de caché o algo que reconoce que el tamaño del archivo ha cambiado.

Si alguien tiene experiencia en el uso de esta biblioteca en particular, cualquier ayuda sería muy apreciada.

Gracias de antemano.

Respuesta

59

He echado un vistazo al código fuente. Procesa el método setImageWithURL así:

  1. Preguntar al de la memoria caché si la imagen está ahí, si es así devolver la imagen y no ir más lejos
  2. Pregunte la caché de disco si la imagen está ahí, Si es así devolver la imagen y no ir más lejos
  3. intenta descargar la imagen, la imagen en el éxito volver otra cosa mantener la imagen de marcador de posición

no hay ninguna solicitud enviada a pedir al servidor remoto si hay una nueva versión, mientras que hay algo viejo en el disco, como usar ETags del protocolo HTTP.

Excavar un poco más el tiempo de caché se establece en un valor estático en SDImageCache.m

static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week 

no se puede cambiar con un regulador.

De modo que mientras la imagen en la memoria caché sea válida, la lib de SDWebImage no descargará nada nuevo. Después de una semana, descargará su imagen modificada.

+3

@Fulvio Es tiempo de una semana en segundos: 60 segundos * 60 minutos * 24 horas * 7 días = 604800 segundos. Un día es solo 60 * 60 * 24 = 86400. –

+2

¿Esto significa que después de una semana todos los activos en la memoria caché se volverán a descargar? incluso si siguen igual? – zanona

+0

@zanona exactamente. SDWebImage no usa el Etag para detectar cambios. –

7
NSURL *imageUrl = nil; 
    NSDate *lastUpdate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastUpdate"]; 
    NSDate *currentDate = [NSDate date]; 

    if (lastUpdate == nil 
     || ![lastUpdate isKindOfClass:[NSDate class]] 
     || [currentDate timeIntervalSinceDate:lastUpdate] > 60 * 60 *24) { 
      [[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"lastUpdate"]; 
      NSString *urlString = [NSString stringWithFormat:@"http://yourdomain.com/image/image.png?%f", [currentDate timeIntervalSince1970]]; 
      imageUrl = [NSURL URLWithString:urlString]; 
    } 
10

El problema con SDImageCache de envejecimiento (que ahora tiene un colocador: maxCacheAge) es que SDWebImage hace nunca nada con ella de forma proactiva. Necesita invocar CleanDisk usted mismo en algún momento para purgar los datos antiguos de la memoria caché. Nota: SDWebImage invoca CleanDisk cuando la aplicación finaliza, pero no se garantiza que las aplicaciones reciban una notificación de finalización del sistema operativo.

+2

Solo una advertencia esto no es cierto a partir de septiembre de 2014. Compruebe SDImageCache.m eche un vistazo a - (void) cleanDiskWithCompletionBlock – Luke

21

Puede usar el parámetro options.

[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"] options:SDWebImageRefreshCached]; 

¡Salud!

4

A continuación se muestra lo que he observado.

  1. Si el nombre de la imagen/ruta es la misma, SDWebImage no va a descargarlo de nuevo durante 1 semana.

  2. Independientemente del nombre de la imagen, SDWebImage volverá a descargar la imagen después de 1 semana (desde el momento de la descarga).

    static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week

  3. Tienen una base de datos donde se almacenan todas las imágenes URL. Para ellos, la URL de la imagen es como la clave principal (clave única).

Así que básicamente lo que hacen es si la URL se cambia y no está presente en DB, descárguelo.

Desde mi punto de vista, lo que están haciendo es DERECHO. Ex. Si carga una imagen, digamos que para el usuario A, el nombre de la imagen debe cambiarse & esto es básico. Sé que algunos desarrolladores prefieren que el nombre de la imagen sea el mismo (como userA.png siempre).

3

SDWebImage hace un caché agresivo de forma predeterminada. Pero ahora le dan la opción de respetar sus encabezados de control de caché HTTP y obtener la última imagen.

Para ello tienen un nuevo método en el que en las opciones que puede pasar SDWebImageRefreshCached

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/xyz/picture"] 
      placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] 
         options:SDWebImageRefreshCached]; 

se puede encontrar el método más detalles y una explicación completa here.

5

En caso de que desee cambiar la duración de la memoria caché predeterminada en Swift. Establezca esto en su AppDelegate.

Versión 3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS 

Versión 4:

SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS 

-

Creo que esto sólo imágenes de efectos que son cachés después de establecer este valor. IE Si su aplicación almacena en caché una imagen con la caducidad del caché predeterminada y luego lo cambia de otra forma, sus imágenes solo caducarán después de una semana. Una solución fácil a esto es simplemente limpiar su caché.

0

Al leer en el readme SDWeb en git, Podría ayudar:

En su caso, usted puede usar la bandera SDWebImageRefreshCached. Esto se degradará ligeramente el rendimiento, pero respetará las cabeceras de control de caché HTTP:

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] 
       placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] 
          options:SDWebImageRefreshCached]; 
1

reciente Swift 3.0 * y SDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil) 
Cuestiones relacionadas