Ios 使用SDWebImage在服务器上更改映像时如何更新缓存中的映像
我正在使用SDWebImage库从服务器下载图像。Ios 使用SDWebImage在服务器上更改映像时如何更新缓存中的映像,ios,objective-c,caching,sdwebimage,Ios,Objective C,Caching,Sdwebimage,我正在使用SDWebImage库从服务器下载图像。 当使用相同的url在服务器上更新映像时,SDWebImage无法更新缓存的映像。如果url未更改,SDWebImage现在可以知道该映像已在服务器上更改 SDWebImage默认情况下会进行一些缓存,因此如果图像发生更改,最好使用新的URL。例如,如果您可以控制URL,并且可以在每次更改图像时更改URL,那么您可以这样做 如果不是这样,请尝试在选项字段中使用SDWebImageRefreshCached,以尊重HTTP缓存控制头,如下所示:
当使用相同的url在服务器上更新映像时,SDWebImage无法更新缓存的映像。如果url未更改,SDWebImage现在可以知道该映像已在服务器上更改
SDWebImage
默认情况下会进行一些缓存,因此如果图像发生更改,最好使用新的URL。例如,如果您可以控制URL,并且可以在每次更改图像时更改URL,那么您可以这样做
如果不是这样,请尝试在选项
字段中使用SDWebImageRefreshCached
,以尊重HTTP缓存控制头,如下所示:
[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
查看更多更新:我实际上已经写了一本关于缓存的完整指南,包括缓存验证
SDWebImage
在设置sdwebimagesrefreshcached
选项时使用NSURLCache
。苹果的URL加载系统实现HTTP缓存,包括缓存响应验证。HTTP缓存相当复杂,但是有许多关于HTTP缓存的初学者指南:
或ETag
。这样,每次客户端发送请求时,它都会自动将以前缓存的响应中的Last Modified
或ETag
值包含在您的请求中。如果映像未更改,服务器将以状态代码302(未修改)响应,NSURLConnection/nsursession
将透明地从NSURLCache
向您提供缓存响应。您不必再次下载数据,但每次提出请求时仍需要与服务器进行核对
您还可以使用HTTP缓存控制指定过期日期。如果使用过期机制,NSURLConnection/NSURLSession
将不会重新验证缓存的响应,直到它未过期
有关HTTP缓存控制的更多信息,请参阅上面的链接。HTTP缓存是一种通用缓存机制,应尽可能使用
我建议使用框架加载图像(免责声明:由我编写)。默认情况下,它使用NSURLCache
,同时仍有一个内存缓存来保存解压缩的图像。这里是swift 3中每次刷新缓存的代码
imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)
转到文件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;
}
对我来说,它就像一个符咒。斯威夫特4
只需在SDWebImage库中使用以下函数:
SDImageCache.shared().removeImage(forKey: (ImagePath), withCompletion: nil)
此功能将删除存储在内存和磁盘中的现金,之后只需同时上载新图像,即可正常工作。谢谢回复。在服务器上更新图像时,url是相同的。问题是,当我更新服务器上的图像并移回上一个屏幕时,在重新加载表视图后,图像仍然是相同的。是的,图像是相同的,因为它已经被缓存,并且url没有更改。因此,SDWebImage无法知道映像在服务器端已更改。试着解决问题。是的,这就是问题所在。但当我重新加载tableview时,它应该会更新图像。重新加载tableview时,会显示缓存的图像,因为SDWebImage会在内部缓存图像。我的意思是,每次重新加载表视图SDWebImage时,都会检查它是否缓存了特定URL的图像,如果是,则显示它。因此,只要URL没有更改,图像也不会更改。如果您没有访问服务器的权限,并且在图像更改时无法更改URL,那么我现在看到的唯一解决方案是在重新加载表视图之前清除SDWebImage缓存。我已经尝试过此代码,但它不会更新图像。问题是,当我更新服务器上的映像并移回上一个屏幕时,在重新加载表视图后,该映像仍然存在。您必须确保服务器设置了正确的HTTP缓存控制头。我刚刚测试了一个带有Master->Detail结构的示例项目和一个单元格,其中有一个来自dropbox共享URL的图像,进入详细信息屏幕,更改dropbox上的图像,同时保持相同的名称和共享URL,确保dropbox停止同步,按下应用程序上的返回键,图像更新。看一看示例项目Yes,它是dropbox图像的工作完善程序。我认为问题来自服务器端。你对服务器端有什么想法吗?上面的方法有效,但不推荐现在使用的方法是。。。[photoView setImageWithURL:[NSURL URLWithString:strPhoto]占位符图像:[UIImage imageName:@“imageName”]选项:SDWebImageRefreshCached usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];当服务器url上的图像发生更改时,这仍然不起作用……但url与以前一样,库没有检测到imageon的更改。请注意,当我尝试Nuke时,是否有方法从缓存中删除特定图像并重新加载新图像?还有一种清除整个缓存以便从服务器重新加载所有映像的方法?您是否使用了最新版本的SDWebImage?使用此方法的目的是什么?因为当我们更新任何图片时,通常使用相同的url,但图片在那个时候是新的。为了得到新的更新图片,我们可以使用上面的方法。是的,出于同样的目的,我尝试过。但它仍然不工作,它显示旧图像。图像URL是由后端开发人员创建的吗?或者您为此传递了任何名称?让我们来看看。请注意,ImagePath是用于下载图像的路径,没有url标题。如何从url获取路径?它可以工作。。图像路径基本上是图像的URL。。该URL被用作NSCache的键。。