当服务器上的映像文件发生更改时,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方法:
- 询问内存caching是否存在图像,如果是,则返回图像,不要再进一步
- 询问磁盘caching是否存在图像,如果是,则返回图像,不要再进一步
- 尝试下载图像,成功返回图像,否则保持占位符图像
没有请求发送请求远程服务器,如果有一个新的版本,而有一些旧的磁盘上,如使用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。
以下是我所观察到的。
-
如果图像名称/path相同,则SDWebImage将不会再次下载1周。
-
无论图像名称如何,SDWebImage将在下载后的一周内重新下载图像。
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
-
他们有一个数据库,所有图片的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];