一:关于同一个URL请求多次,返回的数据都是一样的,如果是不断地请求同一个接口会造成一下的问题
(1)用户流量的浪费
(2) 程序响应速度不够快
要解决上面的问题,一般进行缓存
二:想要提高响应的速度或者是想要节省流量的话,就需要用到缓存(内存缓存、硬盘缓存)
(1)检测内存缓存无数据--检测硬盘缓存无数据--URL请求
(1)请求URL后使用服务器返回的数据(解析,显示等)
(2)将服务器的数据存到硬盘或者沙盒
此时内存缓存或者是硬盘缓存中都有数据
再次请求数据分为两种情况:
(1)如果程序并没有被关闭,一直在运行
那么此时内存缓存中有数据,硬盘缓存中有数据。如果此时再次请求数据,直接使用内存缓存中的数据即可
(2)如果程序重新启动
那么此时内存缓存已经消失,没有数据,硬盘缓存依旧存在,还有数据。如果此时再次请求数据,需要读取内存中缓存的数据。
提示:从硬盘缓存中读取数据后,内存缓存中又有数据了
三、缓存的实现
1.说明:
由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)
因此一般只对GET请求进行缓存,而不对POST请求进行缓存
在iOS中,可以使用NSURLCache类缓存数据
iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存
2.关于缓存策略//默认的缓存策略,使用Protocal协议定义
NSURLRequestUseProtocolCachePolicy = 0,
//忽略缓存直接从原始地址下载
NSURLRequestReloadIgnoringLocalCacheData = 1,
//有缓存时使用缓存没缓存时直接从原始地址下载
NSURLRequestReturnCacheDataElseLoad = 2,
//有缓存时使用缓存,没有缓存时请求失败:用于没有建立网络链接的离线模式
NSURLRequestReturnCacheDataDontLoad = 3,
//验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
3.缓存的注意事项
缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:
(1)经常更新:不能用缓存!比如股票、彩票数据
(2)一成不变:果断用缓存
(3)偶尔更新:可以定期更改缓存策略 或者 清除缓存
提示:如果大量使用缓存,会越积越大,建议定期清除缓存
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSURL *url = [NSURL URLWithString:@"http://developer.favourfree.com/index.php/DriverApp_v1_0_0/DriverInfo/ProvinceCity"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置缓存策略
// [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
//发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (data) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"dic:%@",dic);
}
}];
//获得全局的缓存对象
NSURLCache *cache = [NSURLCache sharedURLCache];
// if (这个缓存达到3天) {
// //清理这个请求的缓存
// [cache removeCachedResponseForRequest:request];
// }
//查看该请求是否已经存在缓存
NSCachedURLResponse *response = [cache cachedResponseForRequest:request];
if (response) {
NSLog(@"这个请求已经存在缓存");
}else{
NSLog(@"这个请求还没有缓存");
}