ios开发网络篇-数据缓存(OC)

一:关于同一个URL请求多次,返回的数据都是一样的,如果是不断地请求同一个接口会造成一下的问题

(1)用户流量的浪费

   (2) 程序响应速度不够快

要解决上面的问题,一般进行缓存 


二:想要提高响应的速度或者是想要节省流量的话,就需要用到缓存(内存缓存、硬盘缓存)

(1)检测内存缓存无数据--检测硬盘缓存无数据--URL请求

  ios开发网络篇-数据缓存(OC)_第1张图片



(1)请求URL后使用服务器返回的数据(解析,显示等)

(2)将服务器的数据存到硬盘或者沙盒

 此时内存缓存或者是硬盘缓存中都有数据

ios开发网络篇-数据缓存(OC)_第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(@"这个请求还没有缓存");
    }
   






  


你可能感兴趣的:(iOS)