iOS 网络请求数据缓存
1. NSURLCache简介:
iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)
NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求
NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
NSURLRequestReloadRevalidatingCacheData // 未实现
NSURLCache的常见用法
(1)获得全局缓存对象(没必要手动创建)NSURLCache *cache = [NSURLCache sharedURLCache];
(2)设置内存缓存的最大容量(字节为单位,默认为512KB)- (void)setMemoryCapacity:(NSUInteger)memoryCapacity;
(3)设置硬盘缓存的最大容量(字节为单位,默认为10M)- (void)setDiskCapacity:(NSUInteger)diskCapacity;
(4)硬盘缓存的位置:沙盒/Library/Caches
(5)取得某个请求的缓存- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;
(6)清除某个请求的缓存- (void)removeCachedResponseForRequest:(NSURLRequest *)request;
(7)清除所有的缓存- (void)removeAllCachedResponses;
缓存GET请求
要想对某个GET请求进行数据缓存,非常简单
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置缓存策略
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存
缓存的注意事项
缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:
(1)经常更新:不能用缓存!比如股票、彩票数据
(2)一成不变:果断用缓存
(3)偶尔更新:可以定期更改缓存策略 或者 清除缓存
提示:如果大量使用缓存,会越积越大,建议定期清除缓存
2.借助ETag或Last-Modified判断文件缓存是否有效
通过打印一个response实例,可以看到response header部分如下所示:

我们可以在请求数据时先上传Etag或者是Last-Modified让服务器端进行判断,若数据未发生变动则加载本地数据,否则加载服务器端数据。
请求的HeaderValue和响应的HeaderValue如下所示:


下面以Etag为例进行数据缓存:
先设置缓存内存和硬盘大小:
NSURLCache *urlCache= [[NSURLCache alloc]initWithMemoryCapacity:** diskCapacity:2** diskPath:nil];
    [NSURLCache setSharedURLCache:urlCache];
下载一张图片:
- (IBAction)download:(UIButton *)sender {
    NSURL *url=[NSURL URLWithString:@"http://192.168.1.102:8080/love/images/bg2.jpg"];
    NSMutableURLRequest *mRequest=[NSMutableURLRequest requestWithURL:url];
    mRequest.cachePolicy=NSURLRequestReloadIgnoringCacheData;
    mRequest.timeoutInterval=;
    // 根据请求获取到`被缓存的响应`!
    NSCachedURLResponse *cacheResponse =  [[NSURLCache sharedURLCache] cachedResponseForRequest:mRequest];
    //cacheResponse不存在时设置etag为空
    if (!cacheResponse) {
        self.etag=nil;
    }
    //发送etag
    if (self.etag.length>) {
        //NSLog(@"Etag=%@",self.etag);
        [mRequest setValue:self.etag forHTTPHeaderField:@"If-None-Match"];
    }
        [NSURLConnection sendAsynchronousRequest:mRequest queue:[NSOperationQueue new] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
            // 类型转换(如果将父类设置给子类,需要强制转换)
            NSHTTPURLResponse *httpResponse=(NSHTTPURLResponse*)response;
           // NSLog(@"res=%@",httpResponse);
            // 判断响应的状态码是否是 304 Not Modified (更多状态码含义解释: https://github.com/ChenYilong/iOSDevelopmentTips)
            if (httpResponse.statusCode==) {
                NSLog(@"加载本地缓存图片");
                // 如果是,使用本地缓存
                // 根据请求获取到`被缓存的响应`!
                NSCachedURLResponse *cacheResponse =  [[NSURLCache sharedURLCache] cachedResponseForRequest:mRequest];
                // 拿到缓存的数据
                data = cacheResponse.data;
            }else{
                NSLog(@"请求网络端图片");
            }
            if(data){
                [self performSelectorOnMainThread:@selector(setImage:) withObject:data waitUntilDone:YES];
            }
             self.etag=httpResponse.allHeaderFields[@"Etag"];
        }];
  //  NSArray *arr=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES);
  //  NSString *path=[arr objectAtIndex:0];
   // NSLog(@"%@",path);
}
-(void)setImage:(NSData*)data{
   // NSLog(@"setimage");
     self.imageView.image=[UIImage imageWithData:data];
}
清除所有缓存:
- (IBAction)clearCache:(UIButton *)sender {
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
}
参考文献:
http://www.jianshu.com/p/fb5aaeac06ef
http://www.cnblogs.com/wendingding/p/3950198.html
iOS 网络请求数据缓存的更多相关文章
- iOS开发网络篇—数据缓存
		
iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...
 - [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据
		
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
 - Android okHttp网络请求之缓存控制Cache-Control
		
前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...
 - 【转载】一步一步搭建自己的iOS网络请求库
		
一步一步搭建自己的iOS网络请求库(一) 大家好,我是LastDay,很久没有写博客了,这周会分享一个的HTTP请求库的编写经验. 简单的介绍 介绍一下,NSURLSession是iOS7中新的网络接 ...
 - springmvc接口ios网络请求
		
springmvc: application/json;charset=utf-8的ios网络请求: 后台使用 @RequestBody注解参数接收:
 - iOS网络之数据请求GET和POST
		
1. HTTP和HTTPS协议 1> URL URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位 ...
 - iOS网络请求之multipart/form-data提交数据
		
multipart/form-data表单数据 在http网络请求中,post没有请求长度的限制,因为post把数据放在了body中,而不是像Get一样放在了浏览器的地址栏中(可以这么理解), 所以相 ...
 - iOS 网络请求NSURLSession
		
iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...
 - IOS网络请求之NSURLSession使用
		
前言: 无论是Android还是ios都离不开与服务器交互,这就必须用到网络请求,记得在2013年做iOS的时候那时候用的ASIHTTPRequest框架,现在重新捡起iOS的时候ASIHTTPReq ...
 
随机推荐
- Web Server  IIS7部署网站常遇到的错误及解决办法
			
IIS7部署网站常遇到的错误及解决办法 经常遇到问题: 1.错误:403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS ...
 - NGINX部署配置参考.
			
请求动态页面 1. uwsgi.ini配置文件.(主从负载uwsgi1.) 2. uwsgi2 的配置文件 3.查看. 4.结构图 5.配置 NGINX服务器 定义上游有哪些服务器. 定义转交给up ...
 - OpenStack 数据库操作 demo
			
#!/usr/bin/env python from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine f ...
 - centos7 虚拟机中,网卡不启动的解决方式
			
使用NAT模式的虚拟centos, 只显示两个网卡,无法连接外网, 输入systemctl start network后报错信息" Restarting network (via syste ...
 - Masnory 学习
			
1:typeof <一元运算符,放在一个运算数之前,运算数可以是任何类型, 用于获取括号中的运算数的数据类型如:NSString CGFloat Int NSArray等> 2: str ...
 - jzoj5806
			
我們發現,如果有奇環顯然無解,因為我們每一次合併一個奇環,一定會產生一個偶環和一個更小的奇環,最終會形成一個三元環而無法合併 所以,這個圖需要是一個二分圖,需要進行二染色 然後把這個圖所有的偶環找出來 ...
 - 八,mysql优化——读写分离
			
读写分离目的是给大型网站缓解查询压力.
 - Kafka Java 客户端开发
			
依赖包导入 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.1 ...
 - VmWare扩展硬盘分区
			
扩展硬盘 对硬盘进行分区 () 查看现有的硬盘分区情况 [mysql@china ~]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/m ...
 - TCP-IP 端口号
			
FTP服务器的TCP端口号 21 Telnet服务器的TCP端口号 23 TETP(简单文件传输协议)服务器的UDP端口号 69 任何TCP/IP实现所提供的服务都用1-1023之间的端口号 至 ...