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

一.相关文章

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返回码更新本地资源)