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

  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. /* 设置缓存的大小为1M*/
  10. [urlCache setMemoryCapacity:1*1024*1024];
  11. //创建一个nsurl
  12. NSURL *url = [NSURL URLWithString:paramURLAsString];
  13. //创建一个请求
  14. NSMutableURLRequest *request =
  15. [NSMutableURLRequest
  16. requestWithURL:url
  17. cachePolicy:NSURLRequestUseProtocolCachePolicy
  18. timeoutInterval:60.0f];
  19. //从请求中获取缓存输出
  20. NSCachedURLResponse *response =
  21. [urlCache cachedResponseForRequest:request];
  22. //判断是否有缓存
  23. if (response != nil){
  24. NSLog(@"如果有缓存输出,从缓存中获取数据");
  25. [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
  26. }
  27. self.connection = nil;
  28. /* 创建NSURLConnection*/
  29. NSURLConnection *newConnection =
  30. [[NSURLConnection alloc] initWithRequest:request
  31. delegate:self
  32. startImmediately:YES];
  33. self.connection = newConnection;
  34. [newConnection release];
  35. }

这个例子中,我们请求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] 请求完成

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

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] 请求完成

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

总结:本文简单的介绍了一下iOS的内存缓存机制,下一篇文章将重点介绍一下本地缓存机制

内存缓存的使用Demo的更多相关文章

  1. Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 内存缓存LruCache和磁盘缓存DiskLruCache的封装类,主要用于图片缓存. 效果图 代码分析 内存缓存LruCache和 ...

  2. ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用

    .NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一 ...

  3. cache4j轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型

    简介 cache4j是一款轻量级java内存缓存框架,实现FIFO.LRU.TwoQueues缓存模型,使用非常方便. cache4j为java开发者提供一种更加轻便的内存缓存方案,杀鸡焉用EhCac ...

  4. 使用Spring缓存的简单Demo

    使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...

  5. smarty 内存缓存

    <?php //缓存 //定义一个该页面的缓存文件路径 $filename="../cache/mainhc.html"; //设置一个缓存时间 $time=; //判断缓存 ...

  6. C#开源磁盘/内存缓存引擎

    前言 昨天写了个 <基于STSdb和fastJson的磁盘/内存缓存>,大家可以先看看.下午用到业务系统时候,觉得可以改进一下,昨晚想了一个晚上,刚才重新实现一下. 更新 1. 增加了对批 ...

  7. 基于STSdb和fastJson的磁盘/内存缓存

    更新 1. 增加了对批量处理的支持,写操作速度提升5倍,读操作提升100倍 2. 增加了对并发的支持 需求 业务系统用的是数据库,数据量大,部分只读或相对稳定业务查询复杂,每次页面加载都要花耗不少时间 ...

  8. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  9. Android ListView 图片异步加载和图片内存缓存

    开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...

随机推荐

  1. Windows操作系统Apache服务器下配置PHP

    在Apache web服务器上发布PHP项目之前,需要进行相应的配置,服务器才能解析php文本,正常显示php动态页面内容.在进行php配置之前默认已经在Windows系统下安装好了Apache服务器 ...

  2. mysql中对比 JSON_VALUE 与 JSON_QUERY

    1. JSON概述 MySQL里的json分为json array和json object. $表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json ob ...

  3. String2LongUtil

    public class String2LongUtil { /** * String类型转换成date类型 * strTime: 要转换的string类型的时间, * formatType: 要转换 ...

  4. HDU6025 Coprime Sequence(gcd)

    HDU6025 Coprime Sequence 处理出数列的 \(gcd\) 前缀和后缀,删除一个数后的 \(gcd\) 为其前缀和后缀的 \(gcd\) . 遍历数列取 \(max\) 即为答案. ...

  5. RF通过命令执行用例及自定义报告与日志的位置

    1.执行整个项目下的所有用例: pybot 项目路径.例如: pybot D:\robotPS:robot项目里面所有用例 2.执行某个suit中的所有用例: pybot 项目路径\suit文件名称. ...

  6. 【nginx】常用命令 启动|停止|重启|重新读取配置-centOS7

     查看服务的当前状态 (flaskApi) [root@67 goTest]# systemctl status nginx.service ● nginx.service - The nginx H ...

  7. sql进阶练习题

    student SNO    SNAME    SAGE    SSEX01    赵雷    1990-01-01 00:00:00    男02    钱电    1990-12-21 00:00 ...

  8. vue入门demo:用户管理3

    该入门demo是使用组件的方式实现,不涉及向后端发送请求 说明 把用户列表和添加用户拆分为两个组件,用户列表数据在父组件 获取用户列表:用户列表组件获取父组件的用户列表(父组件向子组件传值)1-1 1 ...

  9. python获取csv文本的某行或某列数据

    #coding = 'utf-8' import csv # 使用list,只能读取列,而且是全文读取,csv.reader会自动把CSV内容生成数组 ''' df = csv.reader(open ...

  10. spark MLlib矩阵四则运算,线性代数

    1.导包请看我的上一篇博文,maven项目的包 https://www.cnblogs.com/wuzaipei/p/10965680.html 2.denseMatirx 矩阵四则运算如下 版本不同 ...