AFN使用etag进行网络缓存
前提:后台返回的接口带etag

第一步
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法里加入代码,也可以抽成一个方法方便调用或更多其他设置
- (void)initCache {
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity: * *
diskCapacity: * *
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我们就从缓存中取数据
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);
}
}];
}
AFN使用etag进行网络缓存的更多相关文章
- NSCache和NSURLCache、网络缓存优化
本文目录 一种缓存优化方案 响应头'Last-Modified'和请求头'If-Modified-Since' 'Keep-Alive'响应头和不离线的URLSession 'Expires'响应头 ...
- 【Swift】 GET&POST请求 网络缓存的简单处理
GET & POST 的对比 源码:https://github.com/SpongeBob-GitHub/Get-Post.git 1. URL - GET 所有的参数都包含在 URL 中 ...
- 使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求 (转)
使用Retrofit和Okhttp实现网络缓存,更新于2016.02.02原文链接:http://www.jianshu.com/p/9c3b4ea108a7 本文使用 Retrofit2.0.0-b ...
- android 项目学习随笔六(网络缓存)
1. 对SharePreference的封装 import android.content.Context; import android.content.SharedPreferences; /** ...
- 使用HttpURLConnection和AsyncTask从网络缓存图片
1.创建NetCacheUtils中创建downloadBitmap(String url)方法 private Bitmap downloadBitmap(String url){ HttpURLC ...
- Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类
Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类 转载自http://www.trinea.cn/android/android-common-lib/ 介绍总结的一 ...
- iOS 网络缓存总结
一.缓存策略: 1.缓存策略的配置: 缺省缓存策略的存储策略需要服务器的响应配置: 缺省缓存策略的使用需要请求端的配置: 2.缓存策略的缺陷: 移动端比较通用的缓存策略是先使用缓存同时更新本地数据: ...
- Android网络缓存的实现思路
在开发群里有多位同学问到了关于Android中网络缓存的问题.事实上不管是Android还是iOS,缓存的大致思路都是同样的,以下就几种情况下的缓存做一个大致的介绍.顺便说一下有些开源的网络请求框架已 ...
- 【Java/Android性能优 7】Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类
本文转自:http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View( ...
随机推荐
- Jquery Ajax跨域访问
一.同源策略 二.跨域的集中方法: 1.服务器端发送请求,服务器作为中继代理(此方法不理解) 2.iframe 3.script标签 通过动过动态生成script标签,并将src指向目标源的方式(im ...
- Python+request 使用pymysql连接数据库mysql的操作,基础篇《十一》
笔记记录: (1)pymysql中所有的有关更新数据(insert,update,delete)的操作都需要commit,否则无法将数据提交到数据库,既然有了commit(),就一定有对应的rollb ...
- springboot2.0整合shiro遇到的问题
1.重启服务器,访问登陆页面,登陆成功后跳转的不是index,而是favicon.ico
- rhel7.0替换centos yum源
1:卸载原先的yum 2:安装centos的yum 有以下的yum yum-utils-1.1.31-24.el7.noarch yum-langpacks-0.4.2-3.el7.noarch yu ...
- tomcate环境搭建
Tomcat 环境搭建 最近在工作之余,看到了一些 Tomcat 的基础资料,感觉蛮好.同时也回忆起自己刚毕业要参加工作那会对 Tomcat 也是各种资料各种查,实属不易.为此,针对最近整理的一些基础 ...
- go语言-关于文件的操作和解释
一.文件存放的位置 bin文件:存放编译后的二进制文件 pkg文件:存放编译后的库文件 src文件:存放源代码文件 二.运行文件的常用命令 两种运行区别(直接运行和编译后运行) 1.编译生成可执行文件 ...
- Mac卸载Python
推荐使用 Homebrew 来安装第三方工具 自己安装的python散落在电脑各处,删除起来比较麻烦 今天在此记录一下删除的过程(以Python3.6为例) 删除Python 3.6 framewor ...
- 关于https的五大误区
如今,https协议正在被广泛重视和使用.随着今年2月初,谷歌旗下Chrome浏览器宣布将所有http标示为不安全网站,许多网站都争相从http升级到了https.当你打开很多网站时,会发现浏览器左上 ...
- python 操作excle 之第三方库 openpyxl学习
目录 python 操作excle 之第三方库 openpyxl学习 安装 pip install openpyxl 英文文档链接 : 点击这里~ 1,定位excel 2,读取excle中的内容 3, ...
- B5G/6G新技术
组网技术:由自组织向自支撑发展:卫星通信(大尺度衰落)采用DTN组网. 多址技术:非正交多址:Polar-SCMA:交织多址:IDMA. 信道技术:多径分集.多普勒分集.OFDM的CP用ZP替代.设计 ...