iOS 缓存 NSURLCache类

2024-06-17 04:58
文章标签 ios 缓存 nsurlcache

本文主要是介绍iOS 缓存 NSURLCache类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文章将只介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存内容。

使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。

内存缓存我们可以使用sdk中的NSURLCache类。NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型。

1、NSURLRequestUseProtocolCachePolicy NSURLRequest默认的cache policy,使用Protocol协议定义。
2、NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载。
3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载。
4、NSURLRequestReturnCacheDataDontLoad 只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式;
5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。
6NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。

NSURLCache还提供了很多方法,来方便我们实现应用程序的缓存机制。下面我通过一个例子来说明,这个例子减少我们对同一个url多次请求。看下面代码:

[plain]  view plain copy
  1. -(IBAction) buttonPress:(id) sender    
  2.   
  3. {    
  4.   
  5.     NSString *paramURLAsString= @"http://www.baidu.com/";    
  6.   
  7.     if ([paramURLAsString length] == 0){    
  8.   
  9.         NSLog(@"Nil or empty URL is given");    
  10.   
  11.         return;    
  12.   
  13.     }    
  14.   
  15.     NSURLCache *urlCache = [NSURLCache sharedURLCache];    
  16.   
  17.     /* 设置缓存的大小为1M*/   
  18.   
  19.     [urlCache setMemoryCapacity:1*1024*1024];    
  20.   
  21.      //创建一个nsurl    
  22.   
  23.     NSURL *url = [NSURL URLWithString:paramURLAsString];    
  24.   
  25.         //创建一个请求    
  26.   
  27.     NSMutableURLRequest *request =    
  28.   
  29.     [NSMutableURLRequest   
  30.   
  31.      requestWithURL:url    
  32.   
  33.      cachePolicy:NSURLRequestUseProtocolCachePolicy   
  34.   
  35.      timeoutInterval:60.0f];    
  36.   
  37.      //从请求中获取缓存输出    
  38.   
  39.     NSCachedURLResponse *response =    
  40.   
  41.     [urlCache cachedResponseForRequest:request];    
  42.   
  43.     //判断是否有缓存    
  44.   
  45.     if (response != nil){    
  46.   
  47.         NSLog(@"如果有缓存输出,从缓存中获取数据");    
  48.   
  49.         [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];    
  50.   
  51.     }    
  52.   
  53.     self.connection = nil;    
  54.   
  55.     /* 创建NSURLConnection*/   
  56.   
  57.     NSURLConnection *newConnection =    
  58.   
  59.     [[NSURLConnection alloc] initWithRequest:request    
  60.   
  61.                                     delegate:self   
  62.   
  63.                             startImmediately:YES];    
  64.   
  65.     self.connection = newConnection;    
  66.   
  67.     [newConnection release];    
  68.   
  69. }   

这个例子中,我们请求url为www.baidu.com的网站。如果这个url被缓存了,我们直接从缓存中获取数据,否则从www.baidu.com站点上重新获取数据。我们设置了缓存大小为1M。

使用下面代码,我将请求的过程打印出来:

[plain]  view plain copy
  1. - (void)  connection:(NSURLConnection *)connection    
  2.   
  3.   didReceiveResponse:(NSURLResponse *)response{    
  4.   
  5.     NSLog(@"将接收输出");    
  6.   
  7. }    
  8.   
  9. - (NSURLRequest *)connection:(NSURLConnection *)connection    
  10.   
  11.              willSendRequest:(NSURLRequest *)request    
  12.   
  13.             redirectResponse:(NSURLResponse *)redirectResponse{    
  14.   
  15.     NSLog(@"即将发送请求");    
  16.   
  17.     return(request);    
  18.   
  19. }    
  20.   
  21. - (void)connection:(NSURLConnection *)connection    
  22.   
  23.     didReceiveData:(NSData *)data{    
  24.   
  25.     NSLog(@"接受数据");    
  26.   
  27.     NSLog(@"数据长度为 = %lu", (unsigned long)[data length]);    
  28.   
  29. }    
  30.   
  31. - (NSCachedURLResponse *)connection:(NSURLConnection *)connection    
  32.   
  33.                   willCacheResponse:(NSCachedURLResponse *)cachedResponse{    
  34.   
  35.     NSLog(@"将缓存输出");    
  36.   
  37.     return(cachedResponse);    
  38.   
  39. }    
  40.   
  41. - (void)connectionDidFinishLoading:(NSURLConnection *)connection{    
  42.   
  43.     NSLog(@"请求完成");    
  44.   
  45. }    
  46.   
  47. - (void)connection:(NSURLConnection *)connection    
  48.   
  49.   didFailWithError:(NSError *)error{    
  50.   
  51.     NSLog(@"请求失败");    
  52.   
  53. }   

 第一次点击按钮的结果:

2013-05-21 16:26:18.959 CacheDataTest[2838:c07]即将发送请求

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]将接收输出

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.029 CacheDataTest[2838:c07]数据长度为 = 2896

2013-05-21 16:26:19.032 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.032 CacheDataTest[2838:c07]数据长度为 = 4344

2013-05-21 16:26:19.033 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.033 CacheDataTest[2838:c07]数据长度为 = 1448

2013-05-21 16:26:19.036 CacheDataTest[2838:c07]接受数据

2013-05-21 16:26:19.036 CacheDataTest[2838:c07]数据长度为 = 1749

2013-05-21 16:26:19.037 CacheDataTest[2838:c07]将缓存输出

2013-05-21 16:26:19.037 CacheDataTest[2838:c07] ADDRESPONSE - ADDING TO MEMORY ONLY: http://www.baidu.com/

2013-05-21 16:26:19.037 CacheDataTest[2838:c07]请求完成

在看我们第二次点击界面上的按钮,打印结果如下:

2011-07-30 18:52:18.894 Caching[3971:207] 即将发送请求

2011-07-30 18:52:18.895 Caching[3971:207] 将接收输出
2011-07-30 18:52:18.895 Caching[3971:207] 接受数据
2011-07-30 18:52:18.896 Caching[3971:207] 数据长度为 = 7410
2011-07-30 18:52:18.896 Caching[3971:207] 请求完成

我们看到没有“将缓存输出”一项的内容,请求到的数据是第一次请求的累积,也就是第二次是从内存中获取数据的。


Demo代码实例:http://download.csdn.net/detail/u010013695/5422023

转自:http://blog.csdn.net/u010013695/article/details/8956002

这篇关于iOS 缓存 NSURLCache类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068532

相关文章

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re