美文网首页
SDWebImage使用时,url未变,但图片资源变化如何及时更

SDWebImage使用时,url未变,但图片资源变化如何及时更

作者: 雷霸龙 | 来源:发表于2021-04-06 22:32 被阅读0次

    iOS 9以前,SD未能很好地处理此类问题,需要我们手动修改一下源码,举个比较常用的处理方法:

    1、发起时这样调用方法
    [self.imageView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:nil options:SDWebImageRefreshCached];
    
    2、修改SDWebImage源码,需要找到SDWebImageManager.m, 178行代码处换行并追加代码
     downloaderOptions &= ~SDWebImageDownloaderUseNSURLCache;
    

    sd_setImageWithUrl 时,虽然我们指定了SDWebImageRefreshCached操作,但相关逻辑执行后,会启用NSURLCache机制,并在拿到请求结果后被NSURLCache缓存起来,下次有相同请求进来时,会触发NSURLCache机制,返回之前请求的结果,所以,导致url未变,图片资源已变,但客户端展示未刷新问题

    然而,iOS9之后SDWebImage因NSURLConnection被废弃缘故,改用推荐的NSURLSession,在这之后,如果面临url不变,资源改变的情况,再也不需要动手修改源码了,下面我们看看改版后的SD做了什么

    改版后,这处代码做了优化,判断条件修改为除非用户指定了要启用NSURLCache缓存机制,否则默认情况不允许缓存response,规避掉了相关问题

    这样看上去每一次都会重新开启下载任务去下载啊,岂不是造成了资源浪费。答案是否定的,这里就需要引入网络通信协议相关概念,Http、Https缓存机制中提供了验证机制,利用Last-Modified 或者Entity Tag(ET)来验证当前已缓存的资源是否与服务端最新资源相同。

    设置浏览器缓存有下面几种方法:

    • Last-Modified:服务器上文件的最后修改时间
    • Etag:文件标识
    • Expires:本地缓存目录中,文件过期的时间(由服务器指定具体的时间)
    • Cache-control:本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间)

    If-Modified-Since和If-None-Match,服务器检查参数值,如果文件没有改变则返回304,此时浏览器就访问本地缓存了。如果服务器上该文件被修改过,那么参数值就不一样,服务器就把最后的文件返回给浏览器。

    相关文章

      网友评论

          本文标题:SDWebImage使用时,url未变,但图片资源变化如何及时更

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