一.相关文章
二.需求场景
有个活动需要展示一组图片.但是这组图片在活动当天之前可能会更换.
那我们就通过一个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];
}
}];