zoukankan      html  css  js  c++  java
  • 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,到此这次的主题已得到完美解决。

  • 相关阅读:
    Stm32CubeMX5 配置 STM32的串口DMA接受方式 --- 基于 stm32f051k8u6
    Stm32 控制1.44寸液晶显示图片 基于stm32f051k8u6
    makefile自动编译
    Stm32CubeMX5 创建LED控制工程
    ARM 汇编与C之间 的调用
    shell 脚本文件类型.sh ,变量
    bzoj3589 动态树 求链并 容斥
    bzoj2287【POJ Challenge】消失之物 缺一01背包
    bzoj2916: [Poi1997]Monochromatic Triangles 思路
    [NOI2010]超级钢琴 主席树
  • 原文地址:https://www.cnblogs.com/metersj/p/8854163.html
Copyright © 2011-2022 走看看