美文网首页程序员技术栈技术重塑
iOS 中SDWebImage不能及时更新网络图片的问题

iOS 中SDWebImage不能及时更新网络图片的问题

作者: 新南12138 | 来源:发表于2018-12-03 17:36 被阅读2次

问题

最近刚好有写到图片需要及时更新的问题,由于 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 只可以用在 GETHEAD 请求中。

怎么做

所以我们在http 请求的 header 中 加入这个参数,拿到本地缓存图片的修改时间NSFileModificationDate,这样如果网络图片的更新时间比本地的图片修改时间要晚的话,那么就会返回200,这样就可以拿到更新的图片了。

参考

SDWebImage支持URL不变时更新图片内容
MDN Web 文档

相关文章

网友评论

    本文标题:iOS 中SDWebImage不能及时更新网络图片的问题

    本文链接:https://www.haomeiwen.com/subject/jsyygftx.html