利用服务端304返回码更新本地资源

作者: Sunxxxxx丶 | 来源:发表于2017-03-04 15:58 被阅读28次

一.相关文章

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

二.需求场景

有个活动需要展示一组图片.但是这组图片在活动当天之前可能会更换.

那我们就通过一个url来动态的获得这组图片.然后下载保存到本地.然后通过更换url里的资源图片.就可以更换app需要展示的图片了.

但是这样我们就要隔一段时间重新请求一次url.

如果设置的间隔时间过长.那么如果活动开始前几个小时突然更换图片资源.那我们显示的图片就没有更新.

如果设置的间隔时间过短.就会出现浪费用户流量的问题.

这个时候我们就可以通过后台返回的304码来更新本地资源.

每次app启动的时候都去请求这个接口.如果接口返回304.就代表图片资源未更换.那我们就不替换本地图片.如果返回的是200.就代表图片资源替换了.我们就更新本地资源.

三.用法

每次请求都要设置请求头的两个参数.@"If-None-Match".@"If-Modified-Since".这个两个参数在请求成功后都能从response里获得.我们只要在第一次请求成功后保存到本地就可以了.

    NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    // 从沙盒里读取请求头数据
    NSString * headerfieldsPath = [BBPhoneBNJDownloadHelper headerPath:fileName];
    NSDictionary * oldHeaderFields = [[NSDictionary alloc] initWithContentsOfFile:headerfieldsPath];
    
    // 设置请求头的两个参数
    if (oldHeaderFields) {
        NSString * Etag = oldHeaderFields[@"Etag"] ? : @"";
        NSString * LastModified = oldHeaderFields[@"Last-Modified"] ? : @"";
        configuration.HTTPAdditionalHeaders = @{@"If-None-Match" : Etag};
        configuration.HTTPAdditionalHeaders = @{@"If-Modified-Since" : LastModified};
    }
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:downloadUrl] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
        dispatch_semaphore_signal(syncSemaphore);
        
        NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
        NSDictionary * headerFields = httpResponse.allHeaderFields;
        NSInteger statusCode = httpResponse.statusCode;
        if (statusCode == 200) {
        
            // 请求成功后.将请求头保存到沙盒.
            [headerFields writeToFile:headerfieldsPath atomically:YES];
            [BBPhoneBNJDownloadHelper copyZipSourceFromLocation:location fileName:fileName];
            
            dispatch_async(dispatch_get_main_queue(), ^{
                if (callback) {
                    callback();
                }
            });
        } else if (![BBPhoneBNJDownloadHelper isHaveCache]) {
            [BBPhoneBNJDownloadHelper deleteCachesWithFileName:fileName];
        } else if (statusCode == 304) {
            // 返回304表示图片资源未替换
        } else {
            [BBPhoneBNJDownloadHelper deleteCachesWithFileName:fileName];
        }
    }];

相关文章

  • 利用服务端304返回码更新本地资源

    一.相关文章 SDWebImage支持URL不变时更新图片内容 二.需求场景 有个活动需要展示一组图片.但是这组图...

  • mvc复习

    网络状态码: 200:正常访问 304:服务端资源无变化,可使用缓存资源 400:请求参数不合法 401:未认证 ...

  • 304 Not Modified详解

    在客户端向服务端发送http请求时,若返回状态码为304 Not Modified 则表明此次请求为条件请求。在...

  • axios 304 而无法正常拿到数据

    服务器报 304 的原理: 客户端第一次向服务端请求资源时, 服务端响应 200 并在响应头中返回一个 ETag ...

  • 常用HTTP状态码以及客户端缓存

    常用状态码 200 请求返回成功301 永久重定向302 临时重定向304 资源未更改(对应笔记中客户端缓存...

  • 部分Android机html设置no-cache还是缓存了

    .html设置了返回码是304,部分安卓机更新页面后没有及时更新,存在缓存 查看了html响应头缓存设置为:Cac...

  • HTML面试题(一)

    一、什么时候返回304状态码?谈谈H5缓存机制(浏览器缓存机制)。 Q1:304状态码,Not Modified。...

  • 怎样开发和部署前端代码

    怎样开发和部署前端代码 概念:304 协商缓存 需和服务器通信一次本地缓存 通过更新资源路径,让游览...

  • create-react-app

    报错 在GET请求资源的时候返回了304重定向到cache。于是我就大胆地猜测一下,cache是不是可能为本地的....

  • [转]你需要知道的nginx304

    HTTP 304状态码的详细讲解 304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。...

网友评论

    本文标题:利用服务端304返回码更新本地资源

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