我正在使用SDWebImage
库在我的应用程序中缓存网络图像:
https://github.com/rs/SDWebImage/blob/master/README.md
当前使用情况:
[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
我的问题是,一旦图像被缓存,然后几天后服务器上的图像文件被更新为新图像,会发生什么?
目前,我的应用程序仍在显示缓存的图像。
我在任何文档中都看不到有关设置缓存超时或识别文件大小已更改的内容。
如果有人有使用此特定库的经验,那么任何帮助将不胜感激。
提前谢谢。
我看了一下源代码。它像这样处理setImageWithURL
方法:
- 询问内存缓存图像是否存在,如果是,则返回图像,不要再进一步
- 询问磁盘缓存图像是否存在,如果是,则返回图像,不要再进一步
- 尝试下载图像,成功后返回图像,否则保留占位符图像
没有发送请求询问远程服务器是否有新版本,而磁盘上有旧版本,例如使用 HTTP 协议的 ETag。
深入挖掘缓存时间在SDImageCache.m中设置为静态值
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
它不能用二传手改变。
因此,只要缓存中的图像有效,SDWebImage
lib 就不会下载任何新内容。一周后,它将下载您更改的图像。
options
参数。
迅捷版本:
imageView.sd_setImage(with: URL(string: URLWithString:profilePictureUrl),
placeholderImage: UIImage(named: "placeholder"),
options: .refreshCached,
completed: nil)
Objective-C 版本:
[imageView sd_setImageWithURL:[NSURL URLWithString:profilePictureUrl]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
options:SDWebImageRefreshCached
completed: nil];
干杯!
SDImageCache老化的问题(现在有一个setter:maxCacheAge)是SDWebImage从来没有真正主动地用它做任何事情。您需要在某个时候自己调用cleanDisk以从缓存中清除旧数据。注意: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];
}
更改 Swift 中的默认缓存持续时间。在您的应用程序代表中设置此设置。
版本3:
SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS
版本4:
SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS
-
我相信这只会影响设置此值后缓存的图像。IE 如果您的应用缓存具有默认缓存过期的图像,然后将其更改为其他内容,则您的图像仍将仅在一周后过期。一个简单的解决方案是清除缓存。
我观察到的。
如果映像名称/路径相同,SDWebImage 将在 1 周内不再下载。
无论映像名称如何,SDWebImage 都将在 1 周后(从下载时起)重新下载映像。
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
他们有一个存储所有图像URL的数据库。对他们来说,图像URL就像主键(唯一键)。
所以基本上他们所做的是如果 URL 被更改并且不存在在数据库中,请下载它。
从我的角度来看,他们正在做的事情是正确的。 例如。如果您上传图像,例如对于用户 A,则必须更改图像名称,这是基本的。我知道一些开发人员更喜欢图像名称相同(例如用户 A.png总是如此)。
SDWebImage 默认执行主动缓存。但是现在,它们提供了尊重HTTP缓存控制标头并获取最新图像的选项。
为此,他们有一种新的方法,您可以在选项中传递SDWebImageRefreshCached
。[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/xyz/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
您可以在此处找到完整的方法详细信息和说明。
最新的 Swift 3.0* 和 SDWebImage
SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
SDWebImage flow:
1) SDWebImage
缓存从服务器检索到的图像
2)SDWebImage
使用url是从缓存中获取图像的键
3) SDWebImage
检查:
如果它能够从缓存中获取图像 - 确定
如果没有(例如 URL 已更改) - 无法从缓存中获取图像
所以实际上,你会得到空的ImageView,SDWebImage
必须再次从服务器检索图像
正如我在 git 中的 SDWeb 自述文件中读到的那样,它可能会有所帮助:
在您的情况下,您可以使用SDWebImageRefreshCached
标志。这会稍微降低性能,但会遵循 HTTP 缓存控制标头:
[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];