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

iOS开发之内存缓存机制的更多相关文章

  1. IOS - 开发之内存缓存机制

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

  2. [转载]对iOS开发中内存管理的一点总结与理解

    对iOS开发中内存管理的一点总结与理解   做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...

  3. 内存缓存机制and垃圾回收机制

    一.内存缓存机制 var_dump(memory_get_usage(true)); $a="laruence"; var_dump(memory_get_usage(true)) ...

  4. IOS开发的内存管理

    关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...

  5. IOS开发小记-内存管理

    关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...

  6. iOS开发ARC内存管理技术要点

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  7. (转)iOS开发ARC内存管理技术要点

    转自:http://www.cnblogs.com/flyFreeZn/p/4264220.html 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automati ...

  8. iOS开发——高级技术&签名机制

    签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...

  9. iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

随机推荐

  1. DOS日期和时间 - Robin Hu的专栏 - 博客频道 - CSDN.NET

    body { font-family: Microsoft YaHei UI,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-ser ...

  2. 自行修改android.jar使其包含隐藏api

    1) 从指定版本的rom内获取到framework.jar 2) 解压framework.jar和android sdk内的android.jar 3) 将framework.jar解出来的东西拷到a ...

  3. codeforces 665A Buses Between Cities

    简单题 #include<cstdio> #include<cstring> #include<cmath> #include<vector> #inc ...

  4. VHD容量调整的方法(保存原有vhd)

    VHD容量调整的方法(保存原有vhd)特别对于RAMOS的VHD,调整VHD容量的办法:1.在WIN7或者7PE中,右击我的电脑→管理→磁盘管理,挂载原始VHD文件,然后新建一个VHD文件,初始化,格 ...

  5. 使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍

    使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍 Windows MobileMobileWindowsMicrosoftWinForm 介绍 Microso ...

  6. kafka 集群部署 多机多broker模式

    kafka 集群部署 多机多broker模式 环境IP : 172.16.1.35   zookeeper   kafka 172.16.1.36   zookeeper   kafka 172.16 ...

  7. 从url下载图片--java与python实现方式比较

    从url下载图片--java与python实现方式比较 博客分类: 技术笔记小点滴 javapython图片下载  一.java的实现方式 首先读取图片 //方式一:直接根据url读取图片 priva ...

  8. (中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。

    Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...

  9. [iOS Animation]-CALayer 隐式动画

    隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第一部分讨论了Core Animation除了动画之外可以做到的任何事情.但是动画是Core Animation库一个非常显著的 ...

  10. opencv图像特征检测之斑点检测

    前面说过,图像特征点检测包括角点和斑点,今天来说说斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力. ...