当服务器上的映像文件发生更改时,SDWebImagecaching映像在我的应用程序中会发生什么情况?

我正在使用SDWebImage库在我的应用程序中cachingWeb图像:

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

目前用途:

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

我的问题是,一旦图像被caching,然后几天后,服务器上的图像文件已经更新了一个新的图像会发生什么?

目前我的应用程序仍然显示caching的图像。

我无法看到有关设置caching超时的任何文档,或者可以识别文件大小已更改的文档。

如果任何人有经验使用这个特殊的图书馆,那么任何帮助将不胜感激。

提前致谢。

我看了一下源代码。 它像这样处理setImageWithURL方法:

  1. 询问内存caching是否存在图像,如果是,则返回图像,不要再进一步
  2. 询问磁盘caching是否存在图像,如果是,则返回图像,不要再进一步
  3. 尝试下载图像,成功返回图像,否则保持占位符图像

没有请求发送请求远程服务器,如果有一个新的版本,而有一些旧的磁盘上,如使用HTTP协议的ETags 。

挖掘更深入的caching时间设置为SDImageCache.m中的静态值

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

它不能用setter来改变。

所以只要caching中的图像有效,SDWebImage lib将不会下载任何新的内容。 一个星期后,它会下载您更改的图像。

您可以使用options参数。

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

干杯!

SDImageCache老化的问题(现在有一个setter:maxCacheAge)是SDWebImage从来没有真正主动地做任何事情。 您需要自己调用cleanDisk来清除caching中的旧数据。 注意:SDWebImage会在应用程序终止时调用cleanDisk,但应用程序不能保证从操作系统获得终止通知。

  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]; } 

Incase你正在寻找更改默认caching持续时间在Swift中。 在你的AppDelegate中设置。

版本3:

 SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS 

版本4:

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

我相信这只会影响这个值设置后的caching的图像。 IE浏览器如果你的应用程序caching一个默认的caching过期的图像,然后改变它的东西,你的图像仍然只会在一个星期后过期。 一个简单的解决办法就是清除caching。

以下是我所观察到的。

  1. 如果图像名称/path相同,则SDWebImage将不会再次下载1周。

  2. 无论图像名称如何,SDWebImage将在下载后的一周内重新下载图像。

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

  3. 他们有一个数据库,所有图片的URL存储。 对于他们来说,图片的URL就像主键(唯一键)。

所以基本上他们所做的是如果URL被更改并且不存在于数据库中,请下载它。

从我的angular度来看,他们正在做的是正确的。 防爆。 如果你上传图片让我们说,用户A,图像名称必须改变,这是基本的。 我知道一些开发人员更喜欢图像名称是一样的(总是像userA.png)。

SDWebImage默认会进行积极的caching。 但是现在他们可以select尊重HTTPcaching控制头并获得最新的图像。

为此,他们有一个新的方法,在你可以通过SDWebImageRefreshCached的选项

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

你可以在这里find完整的方法细节和解释。

最新的Swift 3.0 *和SDWebImage

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

正如我在SDIT自述中读到的,它可能有助于:

在你的情况下,你可以使用SDWebImageRefreshCached标志。 这会稍微降低性能,但会尊重HTTPcaching控制标头:

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