文件下载的缓存策略

文件缓存:ETag或Last-Modified判断文件缓存是否有效

如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

Last-Modified 是资源最后修改的时间戳,往往与缓存时间进行对比来判断缓存是否过期。

ETag是的功能与 Last-Modified类似:服务端不会每次都会返回文件资源。客户端每次向服务端发送上次服务器返回的 ETag值,服务器会根据客户端与服务端的 ETag值是否相等,来决定是否返回 data,同时总是返回对应的 HTTP状态码。客户端通过 HTTP状态码来决定是否使用缓存。比如:服务端与客户端的 ETag值相等,则 HTTP状态码为 304,不返回 data。服务端文件一旦修改,服务端与客户端的 ETag值不等,并且状态值会变为200,同时返回 data。

- (void)downloadFile

{

    /*

     1.NSURLRequestUseProtocolCachePolicy NSURLRequest                  默认的cache policy,使用Protocol协议定义。

     2.NSURLRequestReloadIgnoringCacheData                                        忽略缓存直接从原始地址下载。

     3.NSURLRequestReturnCacheDataDontLoad                                     只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式

     4.NSURLRequestReturnCacheDataElseLoad                                     只有在cache中不存在data时才从原始地址下载。

     5.NSURLRequestReloadIgnoringLocalAndRemoteCacheData           忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。

     6.NSURLRequestReloadRevalidatingCacheData                              :验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据

     */

    

    NSString *fileDownLoadPath = @"https://s3.cn-north-1.amazonaws.com.cn/zplantest.s3.seed.meme2c.com/area/area.json";

    

    NSString *lastModified = [NSUserDefaults.standardUserDefaults stringForKey:@"Last-Modified"] ?: @"";

    NSString *lastModifiedeTag = [NSUserDefaults.standardUserDefaults stringForKey:@"Etag"] ?: @"";

    

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:fileDownLoadPath]];

//    request.cachePolicy = NSURLRequestUseProtocolCachePolicy;

//    服务器做对比, 不用重复下载

//    [request setValue:lastModified forHTTPHeaderField:@"If-Modified-Since"];  // Last-Modified

   [request setValue:lastModifiedeTag forHTTPHeaderField:@"If-None-Match"];  // ETag

    [request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"];

    LMJWeakSelf(self);

    NSLog(@"%@", request);

    MBProgressHUD *hud = [MBProgressHUD showProgressToView:weakself.view Text:@"下载中"];

    [[[LMJRequestManager sharedManager] downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {

        hud.progress = (downloadProgress.completedUnitCount) / (CGFloat)(downloadProgress.totalUnitCount);

        NSLog(@"%lf", ((float)downloadProgress.completedUnitCount) / (downloadProgress.totalUnitCount));

    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

        return [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:[fileDownLoadPath lastPathComponent]]];

    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

        [MBProgressHUD hideHUDForView:weakself.view animated:YES];

        NSLog(@"%@", filePath);

        NSLog(@"%@", response);

        NSLog(@"%@", error);

        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

        [self.view makeToast:[NSString stringWithFormat:@"statuscode: %zd, 200是下载成功, 304是不用下载", httpResponse.statusCode]];

        NSString *lastModified = [httpResponse allHeaderFields][@"Last-Modified"];

        NSString *lastModifiedeTag = [httpResponse allHeaderFields][@"Etag"];

        if (lastModified && !error) {

            [NSUserDefaults.standardUserDefaults setObject:lastModified forKey:@"Last-Modified"];

            [NSUserDefaults.standardUserDefaults setObject:lastModifiedeTag forKey:@"Etag"];

        }

        NSLog(@"%@", lastModified);

    }] resume];

}

原文地址:https://www.cnblogs.com/wj0920wjx/p/8856087.html