zoukankan      html  css  js  c++  java
  • AFN使用etag进行网络缓存

    前提:后台返回的接口带etag

    第一步

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    方法里加入代码,也可以抽成一个方法方便调用或更多其他设置

    - (void)initCache {
        
        NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
                                                          diskCapacity:20 * 1024 * 1024
                                                              diskPath:@"NSURLCache"];
        [NSURLCache setSharedURLCache:cache];
    }

    我这里使用的是系统自带的NSURLCache,好处就是他会自动处理存,你只需要处理取就行了,可能觉得系统存,会优化一点吧,

    当然你也可以使用性能比较好的一些第三方来存取,比如YYCache、PINCache

    设置AFN

            [_manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

    要是不 这样设置的话,它会一直返回200给你,当然如果你们跟后台约定了缓存失效的时间,那也可以不用看什么304,直接判断本地缓存的有效期就行了

    然后我们就开始加入etag,存入etag,304时从缓存取了

     if (method == RequestMethodGet) {
         
            YYCache *urlCache = [YYCache cacheWithName:@"EtagCache"];
            NSString* etag = (NSString *)[urlCache objectForKey:cacheKey];
            if (etag != nil){
                // get时如果有etag,我们就加入到headerField中
                [_manager.requestSerializer setValue:etag forHTTPHeaderField:@"If-None-Match"];
            }
            task = [_manager GET:api parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
                if ([(NSHTTPURLResponse *)task.response allHeaderFields][@"Etag"]) {
                    // 请求成功后,如果有etag,我们就存起来
    [urlCache setObject:[(NSHTTPURLResponse *)task.response allHeaderFields][@"Etag"] forKey:cacheKey];
                }
                respondSuccessBlock(task, responseObject);
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
                if ([(NSHTTPURLResponse *)task.response statusCode] == 304) {
                    
    // 返回304我们就从缓存中取数据
                    NSCachedURLResponse* cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:task.currentRequest];
                    id responseObject = [_manager.responseSerializer responseObjectForResponse:cachedResponse.response data:cachedResponse.data error:nil];
                    respondSuccessBlock(task,responseObject);
                } else {
                    
                    respondErrorBlock(task, error);
                }
                
            }];
        }
  • 相关阅读:
    深入学习Spring框架(四)- 事务管理
    深入学习Spring框架(三)- AOP面向切面
    深入学习Spring框架(二)- 注解配置
    深入学习Spring框架(一)- 入门
    深入学习Mybatis框架(二)- 进阶
    深入学习Mybatis框架(一)- 入门
    短uuid生成
    from __future__ import division
    django-orm 快速清理migrations缓存
    Ajax请求设置csrf_token
  • 原文地址:https://www.cnblogs.com/songxing10000/p/6509281.html
Copyright © 2011-2022 走看看