前面一片文章介绍了如何上传和下载文件,这篇文章将介绍一下如何在iOS设备中进行缓存。

这篇文章将只介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存内容。

使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程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的内存缓存机制,下一篇文章将重点介绍一下本地缓存机制

iOS缓存到内存的更多相关文章

  1. 转 cocos2d-x 优化(纹理渲染优化、资源缓存、内存优化)

    概述 包括以下5种优化:引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化   引擎优化 2.0版本比1.0版本在算法上有所优化,效率更高.2.0版本使用OpenGl ES 2.0图形库,1.0版本 ...

  2. 006 [翻译] Haneke(一个Swfit iOS缓存类)

    Github项目地址:https://github.com/Haneke/HanekeSwift Haneke是一个用swift写成的轻量级iOS类,以简单好用著称(design-decisions- ...

  3. ios 缓存相关信息收集

    链接:http://www.cnblogs.com/pengyingh/category/353093.html 使用NSURLCache让本地数据来代替远程UIWebView请求 摘要: 原文作者: ...

  4. iOS缓存框架-PINCache解读

    文/Amin706(简书作者)原文链接:http://www.jianshu.com/p/4df5aad0cbd4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在项目中总是需要缓存一 ...

  5. IOS缓存管理之PINCache使用

    前言: 今年重点在于公司iOS架构的梳理工作,上周整理了http请求接口管理与解耦,接下来准备整理一下项目中的缓存处理,目前项目中使用的是PINCache,去年加入这个开源框架时并没有对这个框架进行了 ...

  6. IOS 缓存思路

    为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时内存缓存中没有数据硬盘缓存中没有数据 当服务器返回数据时,需要做以下步骤 使用服务器的数据(比如解析.显示) 将服务器的 ...

  7. iOS性能优化-内存优化

    https://blog.csdn.net/a184251289/article/details/82589128 2018年09月10日 14:25:31 xingshao1990 阅读数:328 ...

  8. iOS夯实:内存管理

    iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 ...

  9. IOS开发的内存管理

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

随机推荐

  1. 【转】浏览器中输入url后发生了什么

    原文地址:http://www.jianshu.com/p/c1dfc6caa520 在学习前端的过程中经常看到这样一个问题:当你在浏览器中输入url后发生了什么?下面是个人学习过程中的总结,供个人复 ...

  2. WebDriverWait显示等待

    等待页面加载完成,找到某个条件发生后再继续执行后续代码,如果超过设置时间检测不到则抛出异常 WebDriverWait(driver, timeout, poll_frequency=0.5, ign ...

  3. 解决Linux主机上的 远程MySQL客户端无法连接的问题

    无法连接到 MySQL 数据库可能的原因有: 1. PHP 无法连接 MySQL 可能是 PHP 配置不正确,没加上连接 MySQL 的功能. 2. MySQL 软件包升级,但没有升级数据库,或安装 ...

  4. ObjectInputStream与ObjectOutputStream类实现对象的存取

    1. ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 ...

  5. JS计算字符串实际长度

    http://www.qttc.net/201207136.html // UTF8字符集实际长度计算 function getStrLeng(str){ var realLength = 0; va ...

  6. silverlight 4中datagrid列标题和列内容居中问题,增加自增长列

    转载:http://www.cnblogs.com/guoyuanwei/archive/2011/01/02/1924163.html 命名空间:xmlns:Primitives="clr ...

  7. bzoj 4819: [Sdoi2017]新生舞会【二分+最小费用最大流】

    如果\( b[i]==0 \)那么就是裸的费用流/KM,当然KM快一些但是为什么不写KM呢因为我不会打板子了 考虑二分答案,那么问题变成了判定问题. \[ ans=\frac {a_1+a_2+... ...

  8. element中upload单图片转base64后添加进数组,请求接口

    //先上代码 <template> <!-- data绑定的参数 getuploadloge: [ { url: '', name: '' } ], --> <!-- 编 ...

  9. Ocelot(十一)- 服务发现

    Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...

  10. html 解决空格显示问题

    前端开发者都知道,在html中手动输入多个空格或者是回车,在页面解析的时候都被解析成一个空白显示,但有时候的需求要求显示多个空格,这个问题怎么解决呢?根绝我个人的经验,目前找到了以下集中解决办法: 1 ...