49

我正在使用该SDWebImage库在我的应用程序中缓存 Web 图像:

https://github.com/rs/SDWebImage/blob/master/README.md

当前使用情况:

[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

我的问题是,一旦图像被缓存,然后几天后服务器上的图像文件被更新为新图像,会发生什么?

目前我的应用程序仍在显示缓存的图像。

我在任何文档中都看不到设置缓存超时或识别文件大小已更改的内容。

如果有人有使用这个特定库的经验,那么任何帮助将不胜感激。

提前致谢。

4

10 回答 10

66

我看了一下源代码。它处理这样的setImageWithURL方法:

  1. 询问内存缓存图像是否存在,如果存在则返回图像并且不要进一步
  2. 询问磁盘缓存图像是否存在,如果存在则返回图像并且不要进一步
  3. 尝试下载图像,成功返回图像,否则保留占位符图像

当磁盘上有旧的东西时,没有发送请求询问远程服务器是否有新版本,比如使用HTTP 协议的ETag

深入挖掘缓存时间设置为SDImageCache.m中的静态值

static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week

它不能用二传手改变。

因此,只要缓存中的图像有效,SDWebImagelib 就不会下载任何新内容。一周后,它将下载您更改的图像。

于 2011-05-24T08:44:01.927 回答
26

您可以使用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];

干杯!

于 2013-12-20T09:01:41.253 回答
10

SDImageCache 老化的问题(现在有一个设置器:maxCacheAge)是 SDWebImage 从来没有真正主动地对它做任何事情。您需要在某些时候自己调用 cleanDisk 以从缓存中清除旧数据。注意:SDWebImage 会在应用程序终止时调用 cleanDisk,但不能保证应用程序会从操作系统获得终止通知。

于 2013-01-05T14:20:33.000 回答
7
    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];
    }
于 2011-09-06T05:04:51.627 回答
7

如果您希望更改 Swift 中的默认缓存持续时间。在你的 AppDelegate 中设置它。

版本 3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS

版本 4:

SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS

-

我相信这只会影响设置此值后缓存的图像。IE 如果您的应用程序缓存了具有默认缓存过期时间的图像,然后对其进行了其他更改,那么您的图像仍然只会在一周后过期。一个简单的解决方案是清除缓存。

于 2015-09-10T05:15:49.757 回答
4

以下是我观察到的。

  1. 如果镜像名称/路径相同,SDWebImage 1 周内不会再次下载。

  2. 无论图像名称如何,SDWebImage 都会在 1 周后重新下载图像(从下载时间开始)。

    static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week

  3. 他们有一个存储所有图像 URL 的数据库。对他们来说,图片 URL 就像主键(唯一键)。

所以基本上他们所做的就是如果 URL 被更改并且不存在于 DB 中,请下载它。

从我的角度来看,他们所做的是正确的。前任。如果您为用户 A 上传图片,则必须更改图片名称,这是基本的。我知道一些开发人员更喜欢图像名称相同(总是像 userA.png)。

于 2014-09-30T08:03:59.100 回答
4

SDWebImage 默认情况下会进行主动缓存。但现在他们提供了尊重您的 HTTP 缓存控制标头并获取最新图像的选项。

为此,他们有一个新方法,您可以在选项中传递 SDWebImageRefreshCached

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/xyz/picture"]
             placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                      options:SDWebImageRefreshCached];

您可以在此处找到完整的方法详细信息和说明。

于 2015-08-24T10:14:59.550 回答
3

SDWebImage 流程:

1)SDWebImage缓存从服务器检索到的图像

2)SDWebImage使用 url 是从缓存中获取图像的关键

3)SDWebImage 检查:

如果它能够从缓存中获取图像 - 好的

如果(例如 url 已更改) - 无法从缓存中获取图像

所以实际上,你会得到空的 ImageView(s) 并且SDWebImage必须再次从服务器检索图像

于 2018-05-04T00:18:07.130 回答
3

最新的 Swift 3.0* 和 SDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
于 2017-08-03T04:08:42.390 回答
1

正如我在 git 中的 SDWeb 自述文件中所读到的,它可能会有所帮助:

在您的情况下,您可以使用该SDWebImageRefreshCached标志。这会稍微降低性能,但会尊重 HTTP 缓存控制标头:

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
                 placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                          options:SDWebImageRefreshCached];
于 2016-02-22T06:33:47.587 回答