【发布时间】:2015-04-19 14:44:56
【问题描述】:
我正在使用 SDWebImage 库从服务器下载图像。 https://github.com/rs/SDWebImage
当图像在服务器上使用相同的 url 更新时,SDWebImage 无法更新缓存的图像。
【问题讨论】:
标签: ios objective-c caching sdwebimage
我正在使用 SDWebImage 库从服务器下载图像。 https://github.com/rs/SDWebImage
当图像在服务器上使用相同的 url 更新时,SDWebImage 无法更新缓存的图像。
【问题讨论】:
标签: ios objective-c caching sdwebimage
SDWebImage 默认会做一些缓存,所以如果图像发生变化,最好使用新的 URL。因此,例如,如果您可以控制 URL,并且可以在每次图像更改时更改它,那么您可以这样做。
如果不是这样,请尝试在 options 字段中使用 SDWebImageRefreshCached 以尊重 HTTP 缓存控制标头,如下所示:
[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
查看更多here
【讨论】:
更新:我实际上已经写了一个关于缓存的完整指南,包括缓存验证https://kean.github.io/blog/image-caching
SDWebImage 在设置 SDWebImageRefreshCached 选项时使用 NSURLCache。 Apple 的 URL 加载系统实现了 HTTP 缓存,包括缓存响应验证。 HTTP 缓存相当复杂,但是有很多关于 HTTP 缓存的初学者指南:
基本上,服务器需要在每个响应中包含一些 HTTP 缓存控制标头。有许多不同的策略可用于实施重新验证。您可以使用Last-Modified 或ETag。这样,每次客户端发送请求时,它都会自动在您的请求中包含来自先前缓存响应的 Last-Modified 或 ETag 值。如果图像没有更改,服务器将响应状态码 302(未修改),NSURLConnection/NSURLSession 将透明地为您提供来自NSURLCache 的缓存响应。您不必再次下载数据,每次发出请求时您仍然需要与服务器核对。
您还可以使用 HTTP 缓存控制指定过期日期。如果使用过期机制,NSURLConnection/NSURLSession 不会重新验证缓存的响应,直到它没有过期。
有关 HTTP 缓存控制的更多信息,请参见上面的链接。 HTTP 缓存是一种通用缓存机制,应尽可能使用。
我建议使用Nuke 框架进行图像加载(免责声明:由我撰写)。它默认使用NSURLCache,同时仍然有一个内存缓存来保存解压缩的图像。
【讨论】:
这是swift 3中每次刷新缓存的代码
imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)
【讨论】:
斯威夫特 4 只需在 SDWebImage 库中使用以下函数:
SDImageCache.shared().removeImage(forKey: (ImagePath), withCompletion: nil)
此功能将删除内存和磁盘中保存的现金,之后只需上传您的新图像即可完美运行。
【讨论】:
转到文件 SDWebImageManager.m 中的第 176 行并更改此行
if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache;
到下面的代码。
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;
}
对我来说,它就像一种魅力。
【讨论】:
如果 URL 未更改,则 SDWebImage 现在可以知道服务器上的图像已更改。
【讨论】: