• 文件下载的缓存策略


    文件缓存: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];

    }

  • 相关阅读:
    Java实现 LeetCode 148 排序链表
    Java实现 LeetCode 148 排序链表
    Java实现 LeetCode 148 排序链表
    Java实现 LeetCode 147 对链表进行插入排序
    Java实现 LeetCode 147 对链表进行插入排序
    VC++的菜单控制和自绘菜单
    仅通过崩溃地址找出源代码的出错行
    积累的VC编程小技巧之框架窗口及其他
    积累的VC编程小技巧之图标、光标及位图
    积累的VC编程小技巧之视图
  • 原文地址:https://www.cnblogs.com/wj0920wjx/p/8856087.html
Copyright © 2020-2023  润新知