50 votes

Qu'advient-il des images mises en cache SDWebImage dans mon application lorsque le fichier image sur le serveur est modifié?

Je suis à l'aide de l' SDWebImage bibliothèque en mémoire cache des images sur le web dans mon application:

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

Utilisation Actuelle:

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

Ma question est de savoir ce qui se passe une fois que l'image a été mise en cache et puis un couple de jours plus tard que le fichier image sur le serveur a été mis à jour avec une nouvelle image?

En ce moment, ma demande est toujours l'affichage de l'image de cache.

Je ne peux pas voir dans la documentation sur la configuration d'un délai d'expiration du cache ou quelque chose qui reconnaît que la taille du fichier a changé.

Si quelqu'un a de l'expérience à l'aide de cette bibliothèque en particulier, alors toute aide serait grandement appréciée.

Merci à l'avance.

70voto

Nick Weaver Points 30418

J'ai eu un coup d'oeil au code source. Il traite les setImageWithURL méthode comme ceci:

  1. Demandez-le dans la mémoire cache si l'image est là, si oui de retour de l'image et de ne pas aller plus loin
  2. Poser le disque de cache si l'image est là, si oui de retour de l'image et de ne pas aller plus loin
  3. Essayez de télécharger l'image, retour sur l'image sur le succès d'autre de garder l'image d'espace réservé

Il n'y a pas de demande envoyé pour demander le serveur distant si il y a une nouvelle version alors qu'il y a quelque chose de vieux sur le disque, comme l'utilisation de ETags du protocole HTTP.

En creusant un peu plus profondément le cache de l'heure est réglé sur une valeur statique dans SDImageCache.m

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

il ne peut pas être modifié avec un setter.

Donc, tant que l'image dans le cache est valide le SDWebImage lib de ne pas télécharger quoi que ce soit de nouveau. Après une semaine, il permet de télécharger votre image.

27voto

Pei Points 1497

Vous pouvez utiliser le paramètre options .

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

À votre santé!

13voto

Mark Krenek Points 249

Le problème avec le vieillissement de SDImageCache (qui a maintenant un setter: maxCacheAge) est que SDWebImage ne fait jamais vraiment de manière proactive avec cela. Vous devez appeler cleanDisk à un moment donné pour purger les anciennes données du cache. Remarque: SDWebImage appelle cleanDisk lorsque l'application se ferme, mais il n'est pas garanti que les applications obtiennent une notification de fin du système d'exploitation.

8voto

kukat Points 106
    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];
    }

4voto

Fahim Parkar Points 8662

Ci-dessous est ce que j'ai observé.

  1. Si le nom de l'image/ chemin d'accès est le même, SDWebImage ne sera pas le télécharger à nouveau pendant 1 semaine.

  2. Indépendamment du nom de l'Image, SDWebImage de re-télécharger l'image après 1 semaine (à partir du moment qu'il est téléchargé).

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

  3. Ils ont une Base de données où toutes les URL des images sont stockées. Pour eux, l'URL de l'image, c'est comme clé primaire (clé unique).

Donc, fondamentalement, ce qu'ils font est de savoir si l'URL est modifiée et ne sont pas présents dans la bd, de le télécharger.

De mon point de vue ce qu'ils font est bien. Ex. Si vous télécharger l'image disons que pour Un utilisateur, le nom de l'image doit être changé et c'est de base. Je sais que certains développeurs préfèrent le nom de l'image à l'être même (comme userA.png toujours).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X