web-dev-qa-db-fra.com

Comment mettre à jour l'image dans le cache lorsque l'image change sur le serveur avec SDWebImage

J'utilise la bibliothèque SDWebImage pour télécharger des images du serveur. https://github.com/rs/SDWebImage

SDWebImage ne peut pas mettre à jour l'image en cache lorsque l'image est mise à jour sur le serveur avec la même URL.

15
Shubham

SDWebImage fait un peu de cache par défaut, il serait donc préférable d'utiliser une nouvelle URL si l'image change. Ainsi, par exemple, si vous avez le contrôle sur l'URL et que vous pouvez le modifier chaque fois que l'image est modifiée, vous pouvez le faire.

Si ce n'est pas le cas, essayez d'utiliser SDWebImageRefreshCached dans le champ options afin de respecter les en-têtes de contrôle de cache HTTP, comme ceci:

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

Voir plus ici

16
Edgar

Mise à jour: J'ai écrit un guide complet sur le cache, y compris la validation du cache https://kean.github.io/blog/image-caching

SDWebImage utilise NSURLCache lorsque vous définissez l'option SDWebImageRefreshCached. Le système de chargement d'URL d'Apple implémente le cache HTTP, y compris la validation des réponses en cache. Le cache HTTP est assez complexe, mais il existe de nombreux guides pour débutants sur la mise en cache HTTP:

Fondamentalement, le serveur doit inclure des en-têtes de contrôle de cache HTTP dans chaque réponse. De nombreuses stratégies différentes peuvent être utilisées pour mettre en œuvre la revalidation. Vous pouvez utiliser Last-Modified ou ETag. Ainsi, chaque fois que le client envoie une demande, il inclura automatiquement dans votre demande la valeur Last-Modified ou ETag de la réponse précédemment mise en cache. Si l'image n'a pas changé, le serveur répond avec le code d'état 302 (non modifié) et NSURLConnection/NSURLSession vous donnera de manière transparente une réponse en cache de NSURLCache. Vous n'avez pas besoin de télécharger à nouveau les données, vous devez toujours vérifier auprès du serveur chaque fois que vous faites une demande.

Vous pouvez également spécifier une date d'expiration à l'aide du contrôle du cache HTTP. Si le mécanisme d'expiration est utilisé, NSURLConnection/NSURLSession ne revalidera pas la réponse en cache jusqu'à ce qu'elle n'expire pas.

Pour plus d'informations sur le contrôle du cache HTTP, voir les liens ci-dessus. Le cache HTTP est un mécanisme de cache universel qui doit être utilisé chaque fois que possible.

Je recommanderais d'utiliser Nuke framework pour le chargement d'images (disclaimer: écrit par moi). Il utilise NSURLCache par défaut tout en conservant un cache mémoire contenant des images décompressées.

10
kean

Voici un code dans Swift 3 pour actualiser le cache à chaque fois

imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)
1
Hardik Thakkar

Swift 4 Utilisez simplement la fonction suivante dans la bibliothèque SDWebImage:

SDImageCache.shared().removeImage(forKey: (ImagePath), withCompletion: nil)

Cette fonction supprimera l’argent enregistré en mémoire et sur le disque. Après cela, il vous suffira de télécharger votre nouvelle image et le tout fonctionnera parfaitement.

0
Remon Atef

Aller à la ligne numéro 176 dans le fichier SDWebImageManager.m et changer cette ligne

if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache;

en dessous du code.

if (options & SDWebImageRefreshCached) {
      // force progressive off if image already cached but forced refreshing
      downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload;
      // remove SDWebImageDownloaderUseNSURLCache flag
      downloaderOptions &= ~SDWebImageDownloaderUseNSURLCache;
      //ignore image read from NSURLCache if image is cached but force refreshing
       downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse;
}

Pour moi, cela a fonctionné comme un charme.

0
Purnendu roy