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);
            }

        }];
    }
时间: 2024-12-21 07:19:12

AFN使用etag进行网络缓存的相关文章

iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

iOS网络缓存扫盲篇 --使用两行代码就能完成80%的缓存需求 下篇预告:使用80%的代码来完成剩下的20%的缓存需求 .敬请 star (右上角)持续关注. 目录 当我们在谈论缓存的时候,我们在谈论什么? GET网络请求缓存 80%的缓存需求:两行代码就可满足 控制缓存的有效性 文件缓存:借助ETag或Last-Modified判断文件缓存是否有效 Last-Modified ETag 总结 一般数据类型借助 Last-Modified 与 ETag 进行缓存 剩下20%的网络缓存需求--真的

【Swift】 GET&POST请求 网络缓存的简单处理

GET & POST 的对比 源码: https://github.com/SpongeBob-GitHub/Get-Post.git 1. URL - GET 所有的参数都包含在 URL 中 1. 如果需要添加参数,脚本后面使用 `?` 2. 参数格式:值对 参数名=值 3. 如果有多个参数,使用 `&` 连接 4. 在 get 方法中,url字符串中不能包含中文或者特殊符号 空格 如果出现,需要添加百分号转义 - POST URL中不包含参数,直接指定登录脚本即可 2. Request

Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

Android公共库--图片缓存 网络缓存 下拉及底部更多ListView 公共类 转载自http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工具类(网络.下载.shell.文件.json等等). TrineaAndroidCommon已开源,地

安卓网络请求图片到图片的三级缓存技术(内存缓存,本地缓存,网络缓存)

安卓网络请求图片,对于我们来说并不陌生,因为每个应用都有可能会用到这一技术.通常情况下,我们第一次都是从网络上请求图片资源,然后将 图片资源保存到内存和本地,下一次动态显示图片的时候就不需要再从网络上请求图片资源了,直接从本地或者内存中获取就可以了.这就涉及到图片 的三级缓存技术,分别是内存缓存,本地缓存,网络缓存. 缓存的流程图: 首先我们定义一个类叫ClassLoader: package com.jsako.showprodinfodemo; import java.io.FileOutp

Android网络缓存的实现思路

在开发群里有多位同学问到了关于Android中网络缓存的问题.事实上不管是Android还是iOS,缓存的大致思路都是同样的,以下就几种情况下的缓存做一个大致的介绍.顺便说一下有些开源的网络请求框架已经提供了对缓存的支持.比如如今比較流行的okhttp.但是有的时候我们希望利用Android自带的网络请求api而且实现自己的网络缓存策略.自己实现会更加灵活,更符合自己的 业务逻辑需求. 我把网络缓存大致先分为两种: 1.网络数据刷新不频繁的 在此种情况下网络数据数据的频率并非非常高,而且对数据的

【Java/Android性能优 7】Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

本文转自:http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工具类(网络.下载.shell.文件.json等等). TrineaAndroidCommon已开源,地址为[email protected],欢迎Star或Fork^_* 示例APK

大学网络缓存加速方案最新优化

本方案适合在线终端在10000台以上大学校园网络,选用秒开缓存产品. 相关产品配备推荐: 产品类别 选择软件(版本)   选择硬件(型号) 产品配置数量 缓存系统 不限服务流量版    MQC-X5000      按每10000台在线终端配1台缓存计算 方案特色: 集群结构良好扩容 适合大学校园网络加速使用 大文件加速 视频/音乐/下载/app加速 高留网比,最大限度减少外网带宽. 对网络无干扰 旁路部署,对原有网络无干扰 实施效果 大幅度节省外网带宽 可节省40%~70%外网带宽 上网加速,

iOS开发网络缓存原理

一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器的数据(比如解析.显示) (

HttpResponseCache 网络缓存使用

Caches HTTP and HTTPS responses to the filesystem so they may be reused, saving time and bandwidth. This class supports HttpURLConnection andHttpsURLConnection; there is no platform-provided cache for DefaultHttpClient or AndroidHttpClient. Installin