当服务器上的图像文件发生变化时,我的应用程序中的SDWebImage缓存图像会发生什么?

fuz*_*uzz 48 iphone caching objective-c uiimageview sdwebimage

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

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

目前的用法:

[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
Run Code Online (Sandbox Code Playgroud)

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

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

我无法在任何有关设置缓存超时的文档中看到或识别出文件大小已更改的内容.

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

提前致谢.

Nic*_*ver 64

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

  1. 询问内存缓存是否有图像,如果是,则返回图像,不再继续
  2. 询问磁盘缓存是否有图像,如果是,则返回图像,不再继续
  3. 尝试下载图像,成功返回图像,否则保留占位符图像

如果存在新版本而没有请求远程服务器的请求,而磁盘上存在旧版本,例如使用HTTP协议的ETag.

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

static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
Run Code Online (Sandbox Code Playgroud)

它不能用setter改变.

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

  • @Fulvio这是一周的时间秒:60秒*60分钟*24小时*7天= 604800秒.一天只有60*60*24 = 86400. (3认同)
  • 这是否意味着一周之后缓存中的所有资产都将被重新下载?即使他们还是一样的? (3认同)

Pei*_*Pei 23

你可以使用options参数.

Swift版本:

imageView.sd_setImage(with: URL(string: URLWithString:profilePictureUrl),
                      placeholderImage: UIImage(named: "placeholder"),
                      options: .refreshCached,
                      completed: nil)
Run Code Online (Sandbox Code Playgroud)

Objective-C版本:

[imageView sd_setImageWithURL:[NSURL URLWithString:profilePictureUrl]
             placeholderImage:[UIImage imageNamed:@"placeholder.png"]
             options:SDWebImageRefreshCached
             completed: nil];
Run Code Online (Sandbox Code Playgroud)

干杯!


Mar*_*nek 10

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

  • 只是一个警告,截至2014年9月,这实际上并非如此.检查SDImageCache.m看看 - (void)cleanDiskWithCompletionBlock (3认同)

kuk*_*kat 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];
    }
Run Code Online (Sandbox Code Playgroud)


Krt*_*tko 6

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

版本3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS
Run Code Online (Sandbox Code Playgroud)

第4版:

SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS
Run Code Online (Sandbox Code Playgroud)

-

我相信这只会影响设置此值后缓存的图像.IE如果你的应用程序缓存具有默认缓存过期的图像,然后将其更改为其他内容,则您的图像仍将在一周后过期.一个简单的解决方案就是清除缓存.