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

2.缓存的思路

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

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

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

3.缓存数据的过程

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

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

5.NSURLCache的用法

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

  NSURLCache *cache = [NSURLCache sharedURLCache];

[cache setMemoryCapacity:1024 * 1024];  // 设置内存缓存容量=1M;如果不设置,默认=512KB

[cache setDiskCapacity:20 * 1024 * 1024]; // 设置硬盘缓存容量=20M;如果不设置,默认=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管理缓存呢?

  其实5.2里,已经用到了NSURLCache了,  request默认的缓存对象就是这个[NSURLCache sharedURLCache] 全局缓存对象.

  下面5.3的代码,演示可以利用NSURLCache判断 XX请求是否有缓存

  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>大量使用缓存时,需要定期清除缓存

转载于:https://www.cnblogs.com/oumygade/p/4245322.html

iOS NSURLCache相关推荐

  1. ios url缓存策略——NSURLCache、 NSURLRequest

    一:url 缓存策略 NSURLRequest requestWithURL:cachePolicy:timeoutInterval: 1:NSURLRequestUseProtocolCachePo ...

  2. 25个增强iOS应用程序性能的提示和技巧 — 中级篇

    本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...

  3. ios 常见性能优化

    1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片 ...

  4. iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

    原文地址:https://github.com/ChenYilong/ParseSourceCodeStudy/blob/master/02_Parse的网络缓存与离线存储/iOS网络缓存扫盲篇.md ...

  5. iOS基础问答面试题连载-附答案

    2017-02-02 timhbw CocoaChina 以下是一些自己收集的比较基础的问题(大神可以忽略),附上答案,方便大家阅读.俗话说得好,基础不牢,地动山摇.文章末尾会提供PDF版的文档,方便 ...

  6. iOS网络缓存扫盲篇

    当我们在谈论缓存的时候,我们在谈论什么? GET网络请求缓存 80%的缓存需求:两行代码就可满足 控制缓存的有效性 文件缓存:借助ETag或Last-Modified判断文件缓存是否有效 Last-M ...

  7. NSCache和NSURLCache网络缓存优化

    首先要说一件重要的事: NSCache和NSURLCache一点关系也没有 NSCache和NSURLCache一点关系也没有 NSCache和NSURLCache一点关系也没有 需要注意的一点是: ...

  8. NSURLCache

    NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制. 作为基础类库 URL 加载系统 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURL ...

  9. iOS开发网络——数据缓存

    一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...

最新文章

  1. python可视化窗口制作一个摇骰子游戏_使用python制作一个抽奖小游戏——骰子游戏...
  2. 免费的400GB网络存储空间
  3. 【Post工具】PostMan 他媳妇 PostWoman
  4. C#中的序列化和反序列化案例
  5. apache camel_Apache Camel请向我解释这些端点选项的含义
  6. 使用CDI简化JAX-RS缓存
  7. c语言程序设计编程解读,【答题】C语言程序设计问题与解释实验
  8. JAVA进阶教学之(一维数组)
  9. java 泛型强制转换_java – 使用泛型强制转换为内部类
  10. Ov两款骁龙865手机即将发布:其中一款或低于2999元
  11. 带下划线的二级域名IE无法读取session
  12. MS SQL Server存储过程的优点有哪些呢?
  13. AQS同步队列结构分析
  14. linux服务器恶意程序检查,扫描Linux服务器查找恶意软件和rootkit的5款工具
  15. 〖Python 数据库开发实战 - MySQL篇②〗- 一文通解关系型数据库与非关系型数据库
  16. 在java中什么是迭代
  17. android集成语音功能
  18. 顺序结构不属于python语言控制结构_顺的解释|顺的意思|汉典“顺”字的基本解释...
  19. 计算机无法超过人类智慧,计算机的智力会超过人类吗?
  20. 物联网安全与隐私保护之物联网安全体系

热门文章

  1. 策略模式(策略不同类,场景不同策略不同,环境策略分离组合)
  2. Flex读取XML配置文件
  3. 利用SQL05特性删除表中重复数据
  4. 百余名欧洲议会议员发函 呼吁英国留在欧盟
  5. 【洛谷 T47488】 D:希望 (点分治)
  6. “Info.plist” couldn’t be removed
  7. redis sentinel 主从切换(failover)解决方案,详细配置
  8. 情怀成驱动力 网游改编手游能火多久?
  9. Matlab实现二进制矩阵转换为十进制
  10. ubuntu下安装openfetion