iOS NSURLCache

1.如果向同一个URL请求多次,返回的数据是一样的,可以考虑用缓存,以提高响应速度,节省用户流量

2.缓存的思路

客户端发起请求之前,检测内存缓存: a.内存缓存有数据,则使用内存缓存的数据

                  b.内存缓存没数据,则监测硬盘(沙盒)缓存: c.硬盘缓存有数据,则使用硬盘缓存

                                         d.硬盘缓存没数据,则向服务器发请求获取数据

3.缓存数据的过程

4.缓存的实现,一般是GET请求需要做数据缓存,POST请求不需要.

苹果提供NSURLCache类专门处理数据缓存

5.NSURLCache的用法

5.1苹果提供了一个全局的缓存对象,用于管理缓存

  NSURLCache *cache = [NSURLCache sharedURLCache];

[cache setMemoryCapacity:1024];  // 设置内存缓存容量,默认是512KB

[cache setDiskCapacity:20]; // 设置硬盘缓存容量,默认是10M,硬盘缓存的位置沙盒/Library/Caches

5.2 网络请求的示例代码

  NSURL *url = [NSURL URLWithString:@"http://localhost/photo/1.png"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad; // 设置缓存策略

 

 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

if (data) {

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

NSLog(@"%@",dict);

}

}];

注:request有cachePolicy属性,cachePolicy是枚举类型,实际上就"4"个枚举值(2个未实现,1个重复)

NSURLRequestUseProtocolCachePolicy = 0,  //默认的缓存策略(取决于http协议)

NSURLRequestReloadIgnoringLocalCacheData = 1,  //忽略缓存,重新请求

NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented,苹果未实现

NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,  //忽略缓存,重新请求

NSURLRequestReturnCacheDataElseLoad = 2,  //如果有缓存就使用缓存,没有就请求

NSURLRequestReturnCacheDataDontLoad = 3,  //始终使用缓存,不请求,适用于应用的离线模式

NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented,苹果未实现

5.3 怎么使用NSURLCache管理缓存呢?

  NSURL *url = [NSURL URLWithString:@"http://localhost/photo/1.png"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad; // 设置缓存策略

 

NSURLCache *cache = [NSURLCache sharedURLCache];  

NSCachedURLResponse *response = [cache cachedResponseForRequest:request];

if (response) {

NSLog(@"该请求存在缓存");

}else{

NSLog(@"该请求不存在缓存");

  }

 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

if (data) {

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

NSLog(@"%@",dict);

}

}];

5.4 定期清除缓存

  #define weekTime 604800

  NSURL *url = [NSURL URLWithString:@"http://localhost/photo/1.png"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad; // 设置缓存策略

 

  //发起请求之前,判断当前时间距离最后缓存时间,是否大于7天

  NSDate *lastCacheTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastCacheTime"];

  if([[NSDate date] timeIntervalSinceDate:lastCacheTime] > weekTime){

  [ [NSURLCache sharedURLCache]  removeAllCachedResponses ];  // 删除所有缓存

  }

 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

if (data) {

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

NSLog(@"%@",dict);

       [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"lastCacheTime"];  //把Now存储为"最后缓存时间"

}

}];

补充: 还可以删除具体的某个请求的缓存  [ [NSURLCache sharedURLCache] removeCachedResponseForRequest:(NSURLRequest *) ]

6 使用缓存的注意事项:

1>经常更新的数据,不能用缓存,例如股票,天气预报

2>偶尔更新的数据,定期更改缓存策略,或清除缓存

3>大量使用缓存时,需要定期清除缓存

时间: 2024-08-20 12:43:23

iOS NSURLCache的相关文章

SDWebImage 图片缓存机制

SDWebImage与iOS系统自带的缓存相比,优势是什么? 从iOS5开始,iOS NSURLCache对于原生得HTTP Response做内存和磁盘缓存.每一次缓存命中(缓存命中就是说内存或者磁盘中有要请求的数据)的时候,app必须把原生的数据转成UIImage.这需要很多操作,比如数据分析转化.内存拷贝等等. 另一方面,SDWebImage在内存中缓存UIImage,在磁盘上存原来的压缩的(但是,已经解码)image文件.UIImage用NSCache存在内存里,所以不需要拷贝操作,并且

[iOS 多线程 & 网络 - 2.7] - NSURLCache

A.基本知识 1.为什么需要缓存? 有时候一个url会请求多次,得到的内容确实一样的 2.缓存的概念 3.缓存数据的过程 当服务器返回数据时,需要做以下步骤(1)使用服务器的数据(比如解析.显示)(2)将服务器的数据缓存到硬盘(沙盒)此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据.再次请求数据分为两种情况:(1)如果程序并没有被关闭,一直在运行 那么此时内存缓存中有数据,硬盘缓存中有数据.如果此时再次请求数据,直接使用内存缓存中的数据即可(2)如果程序重新启动 那么此时内存缓存已经消失,没

 iOS 网络请求缓存:NSURLCache详解

我读过一些开源项目的网络请求缓存的代码,基本上都是采用在本地存文件的方式进行缓存.如果你打算在你的项目中加入网络请求的缓存,可能你并不需要自己造一个轮子,了解一下 NSURLCache 就足够.本文为大家接收的就是ios开发中的NSURLCache相关使用,一起来看看吧. 缓存 首先, NSURLCache 提供的是内存以及磁盘的综合缓存机制.许多文章谈到,使用NSURLCache 之前需要在 AppDelegate 中缓存空间的设置: - (BOOL)application:(UIApplic

iOS网络——NSURLCache设置网络请求缓存

今天在看HTTP协议,看到了response头中的cache-control,于是就深入的研究了一下.发现了iOS中一个一直被我忽略的类——NSURLCache类. NSURLCache NSURLCache用于缓存网络请求,也就是NSURLRequest,然后根据我们设置的NSURLCache策略进行相应的缓存. 首先介绍一下各种策略 策略 意义 UseProtocolCachePolicy  默认行为  ReloadIgnoringLocalCacheData  不使用缓存  ReloadI

iOS多线程与网络开发之NSURLCache

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.基本知识 1.为什么需要缓存? 有时候一个url会请求多次,得到的内容确实一样的 2.缓存的

iOS开发网络篇—数据缓存(使用NSURLCache)

一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器的数据(比如解析.显示) (

iOS之NSURLCache、ASI设置缓存及使用步骤

1 一NSURLCache 2 缓存的使用步骤 3 // 获得全局的缓存对象 4 NSURLCache *cache = [NSURLCache sharedURLCache]; 5 6 // 设置缓存容量 7 cache.memoryCapacity = 1024 * 1024; 8 cache.diskCapacity = 20 * 1024 * 1024; 9 10 // 设置请求的缓存策略 11 request.cachePolicy = NSURLRequestReturnCacheD

iOS 缓存NSURLCache

1.在appdelegate中添加,在每个模块添加这段代码的时候,缓存没有成功. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     // Override point for customization after application launch.     CustomURLCache *urlCache = [

iOS应用性能调优的25个建议和技巧

目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片大小 7. 选择正确的Collection 8. 打开gzip压缩 中级(这些是你可能在一些相对复杂情况下可能用到的) 9. 重用和延迟加载Views 10. Cache, C