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.
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
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.
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)
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.
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.