使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程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类似。

6、NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。

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

  1. -(IBAction) buttonPress:(id) sender
  2. {
  3. NSString *paramURLAsString= @"http://www.baidu.com/";
  4. if ([paramURLAsString length] == 0){
  5. NSLog(@"Nil or empty URL is given");
  6. return;
  7. }
  8. NSURLCache *urlCache = [NSURLCache sharedURLCache];
  9. [urlCache setMemoryCapacity:1*1024*1024];
  10. //创建一个nsurl
  11. NSURL *url = [NSURL URLWithString:paramURLAsString];
  12. //创建一个请求
  13. NSMutableURLRequest *request =
  14. [NSMutableURLRequest
  15. requestWithURL:url
  16. cachePolicy:NSURLRequestUseProtocolCachePolicy
  17. timeoutInterval:60.0f];
  18. //从请求中获取缓存输出
  19. NSCachedURLResponse *response =
  20. [urlCache cachedResponseForRequest:request];
  21. //判断是否有缓存
  22. if (response != nil){
  23. NSLog(@"如果有缓存输出,从缓存中获取数据");
  24. [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
  25. }
  26. self.connection = nil;
  27. NSURLConnection *newConnection =
  28. [[NSURLConnection alloc] initWithRequest:request
  29. delegate:self
  30. startImmediately:YES];
  31. self.connection = newConnection;
  32. [newConnection release];
  33. }

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

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

  1. - (void)  connection:(NSURLConnection *)connection
  2. didReceiveResponse:(NSURLResponse *)response{
  3. NSLog(@"将接收输出");
  4. }
  5. - (NSURLRequest *)connection:(NSURLConnection *)connection
  6. willSendRequest:(NSURLRequest *)request
  7. redirectResponse:(NSURLResponse *)redirectResponse{
  8. NSLog(@"即将发送请求");
  9. return(request);
  10. }
  11. - (void)connection:(NSURLConnection *)connection
  12. didReceiveData:(NSData *)data{
  13. NSLog(@"接受数据");
  14. NSLog(@"数据长度为 = %lu", (unsigned long)[data length]);
  15. }
  16. - (NSCachedURLResponse *)connection:(NSURLConnection *)connection
  17. willCacheResponse:(NSCachedURLResponse *)cachedResponse{
  18. NSLog(@"将缓存输出");
  19. return(cachedResponse);
  20. }
  21. - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
  22. NSLog(@"请求完成");
  23. }
  24. - (void)connection:(NSURLConnection *)connection
  25. didFailWithError:(NSError *)error{
  26. NSLog(@"请求失败");
  27. }

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

  1. 2011-07-30 18:50:24.910 Caching[3971:207] 即将发送请求
  2. 2011-07-30 18:50:28.557 Caching[3971:207] 将接收输出
  3. 2011-07-30 18:50:31.677 Caching[3971:207] 接受数据
  4. 2011-07-30 18:50:31.681 Caching[3971:207] 数据长度为 = 4414
  5. 2011-07-30 18:50:31.682 Caching[3971:207] 接受数据
  6. 2011-07-30 18:50:31.682 Caching[3971:207] 数据长度为 = 2996
  7. 2011-07-30 18:50:38.107 Caching[3971:207] 将缓存输出
  8. 2011-07-30 18:50:38.109 Caching[3971:207] 请求完成

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

  1. 2011-07-30 18:52:18.894 Caching[3971:207] 即将发送请求
  2. 2011-07-30 18:52:18.895 Caching[3971:207] 将接收输出
  3. 2011-07-30 18:52:18.895 Caching[3971:207] 接受数据
  4. 2011-07-30 18:52:18.896 Caching[3971:207] 数据长度为 = 7410
  5. 2011-07-30 18:52:18.896 Caching[3971:207] 请求完成

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

转自:http://mobile.51cto.com/iphone-314374.htm

最新文章

  1. 如何在博客中使用SublimeText风格的代码高亮样式
  2. MachineKey 操作 之 应用集群中SSO应用生成MachineKey
  3. sql count统计技巧
  4. Asp.net mvc5开源项目"超级冷笑话"
  5. MySQL 分组后,统计记录条数
  6. C#设计模式——抽象工厂
  7. 缓存插件 EHCache
  8. windws 安装jdk
  9. MySQL生产库主从重新同步操作注意事项
  10. Poco库网络模块例子解析1-------字典查询
  11. Angular2 VS Angular4 深度对比:特性、性能
  12. 老男孩Python全栈开发(92天全)视频教程 自学笔记09
  13. Access Logging Tomcat
  14. C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法
  15. python Ajax
  16. Lucene 09 - 什么是Lucene的高亮显示 + Java API实现高亮显示
  17. linux关机(重启)命令
  18. Java基础总结1
  19. 关于element-ui日期选择器disabledDate使用心得
  20. shell 发送所有内容到会话

热门文章

  1. 使用VNC远程管理VPS(Centos系统)
  2. vmware中网络连接方式介绍
  3. jdbc批量执行SQL insert 操作
  4. 【HighCharts系列教程】七、导出属性——exporting
  5. 省市二级联动--使用app-jquery-cityselect.js插件
  6. windows服务器下IIS7 安装URL Rewrite(URL重写)模块
  7. Android编程中的5种数据存储方式
  8. 为CKEditor开发插入代码的插件 已提供下载
  9. spring中依赖注入与aop讲解
  10. Android获取手机屏幕宽高