Ios 使用SDWebImage在服务器上更改映像时如何更新缓存中的映像

Ios 使用SDWebImage在服务器上更改映像时如何更新缓存中的映像,ios,objective-c,caching,sdwebimage,Ios,Objective C,Caching,Sdwebimage,我正在使用SDWebImage库从服务器下载图像。 当使用相同的url在服务器上更新映像时,SDWebImage无法更新缓存的映像。如果url未更改,SDWebImage现在可以知道该映像已在服务器上更改 SDWebImage默认情况下会进行一些缓存,因此如果图像发生更改,最好使用新的URL。例如,如果您可以控制URL,并且可以在每次更改图像时更改URL,那么您可以这样做 如果不是这样,请尝试在选项字段中使用SDWebImageRefreshCached,以尊重HTTP缓存控制头,如下所示:

我正在使用SDWebImage库从服务器下载图像。


当使用相同的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缓存的初学者指南:

基本上,服务器需要在每个响应中包含一些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的键。。