iOS缓存到内存
前面一片文章介绍了如何上传和下载文件,这篇文章将介绍一下如何在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多次请求。看下面代码:
- -(IBAction) buttonPress:(id) sender
- {
- NSString *paramURLAsString= @"http://www.baidu.com/";
- if ([paramURLAsString length] == 0){
- NSLog(@"Nil or empty URL is given");
- return;
- }
- NSURLCache *urlCache = [NSURLCache sharedURLCache];
- /* 设置缓存的大小为1M*/
- [urlCache setMemoryCapacity:1*1024*1024];
- //创建一个nsurl
- NSURL *url = [NSURL URLWithString:paramURLAsString];
- //创建一个请求
- NSMutableURLRequest *request =
- [NSMutableURLRequest
- requestWithURL:url
- cachePolicy:NSURLRequestUseProtocolCachePolicy
- timeoutInterval:60.0f];
- //从请求中获取缓存输出
- NSCachedURLResponse *response =
- [urlCache cachedResponseForRequest:request];
- //判断是否有缓存
- if (response != nil){
- NSLog(@"如果有缓存输出,从缓存中获取数据");
- [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
- }
- self.connection = nil;
- /* 创建NSURLConnection*/
- NSURLConnection *newConnection =
- [[NSURLConnection alloc] initWithRequest:request
- delegate:self
- startImmediately:YES];
- self.connection = newConnection;
- [newConnection release];
- }
这个例子中,我们请求url为www.baidu.com的网站。如果这个url被缓存了,我们直接从缓存中获取数据,否则从www.baidu.com站点上重新获取数据。我们设置了缓存大小为1M。
使用下面代码,我将请求的过程打印出来:
- - (void) connection:(NSURLConnection *)connection
- didReceiveResponse:(NSURLResponse *)response{
- NSLog(@"将接收输出");
- }
- - (NSURLRequest *)connection:(NSURLConnection *)connection
- willSendRequest:(NSURLRequest *)request
- redirectResponse:(NSURLResponse *)redirectResponse{
- NSLog(@"即将发送请求");
- return(request);
- }
- - (void)connection:(NSURLConnection *)connection
- didReceiveData:(NSData *)data{
- NSLog(@"接受数据");
- NSLog(@"数据长度为 = %lu", (unsigned long)[data length]);
- }
- - (NSCachedURLResponse *)connection:(NSURLConnection *)connection
- willCacheResponse:(NSCachedURLResponse *)cachedResponse{
- NSLog(@"将缓存输出");
- return(cachedResponse);
- }
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
- NSLog(@"请求完成");
- }
- - (void)connection:(NSURLConnection *)connection
- didFailWithError:(NSError *)error{
- NSLog(@"请求失败");
- }
当我们第一次点击界面上的按钮,打印的结果如下:
- 2011-07-30 18:50:24.910 Caching[3971:207] 即将发送请求
- 2011-07-30 18:50:28.557 Caching[3971:207] 将接收输出
- 2011-07-30 18:50:31.677 Caching[3971:207] 接受数据
- 2011-07-30 18:50:31.681 Caching[3971:207] 数据长度为 = 4414
- 2011-07-30 18:50:31.682 Caching[3971:207] 接受数据
- 2011-07-30 18:50:31.682 Caching[3971:207] 数据长度为 = 2996
- 2011-07-30 18:50:38.107 Caching[3971:207] 将缓存输出
- 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缓存到内存的更多相关文章
- 转 cocos2d-x 优化(纹理渲染优化、资源缓存、内存优化)
概述 包括以下5种优化:引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化 引擎优化 2.0版本比1.0版本在算法上有所优化,效率更高.2.0版本使用OpenGl ES 2.0图形库,1.0版本 ...
- 006 [翻译] Haneke(一个Swfit iOS缓存类)
Github项目地址:https://github.com/Haneke/HanekeSwift Haneke是一个用swift写成的轻量级iOS类,以简单好用著称(design-decisions- ...
- ios 缓存相关信息收集
链接:http://www.cnblogs.com/pengyingh/category/353093.html 使用NSURLCache让本地数据来代替远程UIWebView请求 摘要: 原文作者: ...
- iOS缓存框架-PINCache解读
文/Amin706(简书作者)原文链接:http://www.jianshu.com/p/4df5aad0cbd4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在项目中总是需要缓存一 ...
- IOS缓存管理之PINCache使用
前言: 今年重点在于公司iOS架构的梳理工作,上周整理了http请求接口管理与解耦,接下来准备整理一下项目中的缓存处理,目前项目中使用的是PINCache,去年加入这个开源框架时并没有对这个框架进行了 ...
- IOS 缓存思路
为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时内存缓存中没有数据硬盘缓存中没有数据 当服务器返回数据时,需要做以下步骤 使用服务器的数据(比如解析.显示) 将服务器的 ...
- iOS性能优化-内存优化
https://blog.csdn.net/a184251289/article/details/82589128 2018年09月10日 14:25:31 xingshao1990 阅读数:328 ...
- iOS夯实:内存管理
iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 ...
- IOS开发的内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
随机推荐
- Java Socket实战之四:传输压缩对象
转自:http://developer.51cto.com/art/201202/317546.htm 上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较 ...
- RTSP协议简介(转载)
转自:http://ilinux.iteye.com/blog/505753 Real Time Streaming Protocol 或 者RTSP(实时流媒体协议),是由Real network ...
- rpm安装总结(转载)
转自:http://www.cnblogs.com/nuke/archive/2009/03/03/1402067.html 在RedHat Linux和Mandrake等兼容RedHat的发行版中, ...
- 【WIP】gollum
创建: 2018/03/18 [任务表]TODO 这个博客从来不点发布到首页, 完全100%自用, 全部详细完整的干货.千辛万苦找到这里看到一片空白, 是不是很愤怒? 那就对啦233333
- E20180228-hm-xa
bounds n. 界限; 界限; 出界; 在(某人允许进入的)界限以外; 出格的; 跳跃( bound的名词复数 ); (球等的) 反跳; indice n. 指数(指指标, 如健康指数的指数); ...
- Activiti6.0教程 Eclipse安装Activiti Diagram插件(一)
最近这段时间打算出一个Activiti6.0的详细教程,Activiti作为一个流行的开源工作流引擎,正在不断发展,其6.0版本以API形式提供服务,而之前版本基本都是要求我们的应用以JDK方式与其交 ...
- ssh 公钥登录远程主机 并禁止密码登录
https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-centos7 如果在新的机器上,得先用密码登录一 ...
- hibernate简单实现连接数据库,并实现数据的操作
1:创建实体类 package com.yinfu.entity; public class User { private int id; private String username; priva ...
- Python unittest 基本框架解析(2)
下面例子,是一般测试框架的基本结构 框架知识点包括:实例化被测试模块类.装载测试用例.测试套件打包.保存测试输出结果.生成测试报告等 测试情况包括 :跳过某个case.执行成功.执行失败 #待测试 ...
- Lync客户端证书安装
安装完Lync客户端后,运行时Lync客户端时,报出如下错误: [原因解析] Lync客户端没有正确安装CA证书链. [解决办法] 第一种方法:将计算机加入域. 第二种方法:不加入域的处理方法: 1. ...