web-dev-qa-db-fra.com

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

J'utilise la bibliothèque SDWebImage pour mettre en cache les images 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, puis quelques jours plus tard, ce fichier image sur le serveur a été mis à jour avec une nouvelle image?

Pour le moment, mon application affiche toujours l'image en cache.

Je ne peux pas voir dans la documentation sur la définition 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 avec cette bibliothèque particulière, toute aide serait grandement appréciée.

Merci d'avance.

48
fuzz

J'ai regardé le code source. Il traite la méthode setImageWithURL comme ceci:

  1. Demandez au cache mémoire si l'image est là, si oui retournez l'image et n'allez pas plus loin
  2. Demandez au cache disque si l'image est là, si oui retournez l'image et n'allez pas plus loin
  3. Essayez de télécharger l'image, renvoyez l'image en cas de succès sinon gardez l'image d'espace réservé

Aucune demande n'est envoyée pour demander au serveur distant s'il existe une nouvelle version alors qu'il y a quelque chose d'ancien sur le disque, comme l'utilisation de ETags du protocole HTTP.

En creusant un peu plus profondément, le temps de cache est défini 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.

Aussi longtemps que l'image dans le cache est valide, la librairie SDWebImage ne téléchargera rien de nouveau. Après une semaine, il téléchargera votre image modifiée.

64
Nick Weaver

Vous pouvez utiliser le paramètre options.

Version Swift:

imageView.sd_setImage(with: URL(string: URLWithString:profilePictureUrl),
                      placeholderImage: UIImage(named: "placeholder"),
                      options: .refreshCached,
                      completed: nil)

Version Objective-C:

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

À votre santé!

23
Pei

Le problème avec le vieillissement de SDImageCache (qui a maintenant un setter: maxCacheAge) est que SDWebImage ne fait jamais rien de manière proactive avec. Vous devez appeler vous-même cleanDisk à un moment donné pour purger les anciennes données du cache. Remarque: SDWebImage invoque cleanDisk à la fin de l'application, mais il n'est pas garanti que les applications reçoivent une notification de terminaison du système d'exploitation.

10
Mark Krenek
    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];
    }
7
kukat

Dans le cas où vous cherchez à modifier la durée de cache par défaut dans Swift. Définissez cela dans votre AppDelegate.

Version 3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS

Version 4:

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

-

Je crois que cela n'affecte que les images qui sont des caches une fois cette valeur définie. IE si votre application met en cache une image avec l'expiration du cache par défaut et la change ensuite, vos images n'expireront toujours qu'après une semaine. Une solution facile pour cela, il suffit de vider votre cache.

6
Krtko

SDWebImage effectue une mise en cache agressive par défaut. Mais maintenant, ils donnent la possibilité de respecter vos en-têtes de contrôle de mise en cache HTTP et d'obtenir la dernière image.

Pour cela, ils ont une nouvelle méthode où, dans les options, vous pouvez passer SDWebImageRefreshCached

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

Vous pouvez trouver les détails complets de la méthode et l'explication ici .

4
Gautam Jain

Voici ce que j'ai observé.

  1. Si le nom/chemin de l'image est le même, SDWebImage ne le téléchargera pas à nouveau pendant 1 semaine.

  2. Quel que soit le nom de l'image, SDWebImage téléchargera à nouveau l'image après 1 semaine (à partir du moment où elle est téléchargée).

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

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

Donc, fondamentalement, ce qu'ils font est que si l'URL est modifiée et n'est pas présente dans la base de données, téléchargez-la.

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

4
Fahim Parkar

Flux SDWebImage:

1) SDWebImage met en cache l'image récupérée du serveur

2) SDWebImage utilise l'url est une clé pour obtenir l'image du cache

3) SDWebImage vérifie:

si c'est capable pour obtenir l'image du cache - OK

si non (par exemple, l'URL a été modifiée) - impossible d'obtenir l'image du cache

donc en fait, vous obtiendrez des ImageView (s) vides et SDWebImage devra récupérer à nouveau les images du serveur

3
Svitlana

Dernières Swift 3.0 * et SDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
2
Urvish Modi

Comme je l'ai lu dans le readme de SDWeb dans git, cela pourrait aider:

Dans votre cas, vous pouvez utiliser l'indicateur SDWebImageRefreshCached. Cela dégradera légèrement les performances mais respectera les en-têtes de contrôle de mise en cache HTTP:

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