• SDWebImage支持URL不变时更新图片内容


    SDWebImage在iOS项目中是一个很常用的开源库,而且众所周知的是,它是基于URL作为 Key来实现图片缓存机制的。大多数情况下,
    图片与URL是一一对应的,即使服务器修改了图片也会相应的变更URL。但是在少数情况下,服务器修改了图片后不会变更相应的URL,也就是
    说图片本身的内容变了然而它的URL没有变化,那么按照对SDWebImage的常规使用方法的话,客户端肯定更新不到同一URL对应到服务器已变
    更的图片内容。

    基于这一现象,通过查看SDWebImageDownloader的源码得知,它开放了一个headersFilter的block,意在让开发者可以对所有图片请求追加一些额外的header,这正合我意。那么我们就可以在诸如AppDelegate didFinishLaunching的地方追加如下代码:

    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;
    };

    然后,加载图片的地方以前怎么写还是怎么写,但别忘了Option是SDWebImageRefreshCached

    NSURL *imgURL = [NSURL URLWithString:@"http://weixiaosmile.jpg"];
    [[self imageView] sd_setImageWithURL:imgURL
    placeholderImage:nil
    options:SDWebImageRefreshCached];
    经测试,服务器只修改图片不变更URL的时候,客户端也可以更新到最新的图片。

    OK,到此这次的主题已得到完美解决。

  • 相关阅读:
    分布式理论基础(三)时间、时钟和事件顺序
    分布式理论基础(二)选举、多数派和租约
    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC
    spark入门(三)键值对操作
    spark入门(二)RDD基础操作
    Python的Flask框架入门-Ubuntu
    Python __str__(self)和__unicode__(self)
    Windows下安装和使用MongoDB
    Virtualenv介绍
    python的import与from…import的区别
  • 原文地址:https://www.cnblogs.com/metersj/p/8854163.html
Copyright © 2020-2023  润新知