问题
最近刚好有写到图片需要及时更新的问题,由于 SDWebImage 中的存在缓存,在用户更新了网络头像后,其他人的手机上还是显示了之前的头像,想到了缓存的问题
解决方法
后来查到了这种解决方法,SDWebImageDownloader 有一个 headerFilter 属性
/**
* Set filter to pick headers for downloading image HTTP request.
*
* This block will be invoked for each downloading image request, returned
* NSDictionary will be used as headers in corresponding HTTP request.
*/
@property (nonatomic, copy, nullable) SDWebImageDownloaderHeadersFilterBlock headersFilter;
划重点Set filter to pick headers for downloading image HTTP request.
,所以我们可以在这里对下载图片的请求头进行一些处理。具体的代码如下:
SDWebImageDownloader *imgDownloader = SDWebImageManager.sharedManager.imageDownloader;
imgDownloader.headersFilter = ^NSDictionary *(NSURL *url, NSDictionary *headers) {
NSFileManager *fm = [[NSFileManager alloc] init];
NSString *imgKey = [SDWebImageManager.sharedManager cacheKeyForURL:url];
NSString *imgPath = [SDWebImageManager.sharedManager.imageCache defaultCachePathForKey:imgKey];
NSDictionary *fileAttr = [fm attributesOfItemAtPath:imgPath error:nil];
NSMutableDictionary *mutableHeaders = [headers mutableCopy];
NSDate *lastModifiedDate = nil;
if (fileAttr.count > 0) {
if (fileAttr.count > 0) {
lastModifiedDate = (NSDate *)fileAttr[NSFileModificationDate];
}
}
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
formatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
NSString *lastModifiedStr = [formatter stringFromDate:lastModifiedDate];
lastModifiedStr = lastModifiedStr.length > 0 ? lastModifiedStr : @"";
[mutableHeaders setValue:lastModifiedStr forKey:@"If-Modified-Since"];
return mutableHeaders;
}
什么是 If-Modified-Since
If-Modified-Since
是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200
。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304
响应,而在 Last-Modified
首部中会带有上次修改时间。 不同于 If-Unmodified-Since
, If-Modified-Since
只可以用在 GET
或 HEAD
请求中。
怎么做
所以我们在http 请求的 header 中 加入这个参数,拿到本地缓存图片的修改时间NSFileModificationDate
,这样如果网络图片的更新时间比本地的图片修改时间要晚的话,那么就会返回200,这样就可以拿到更新的图片了。
网友评论