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类似。
6、NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。
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];
- [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 *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] 请求完成
我们看到没有“将缓存输出”一项,请求到的数据是第一次请求的累积,也就是第二次是从内存中获取数据的。
转自:http://mobile.51cto.com/iphone-314374.htm
iOS开发之内存缓存机制的更多相关文章
- IOS - 开发之内存缓存机制
使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...
- [转载]对iOS开发中内存管理的一点总结与理解
对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...
- 内存缓存机制and垃圾回收机制
一.内存缓存机制 var_dump(memory_get_usage(true)); $a="laruence"; var_dump(memory_get_usage(true)) ...
- IOS开发的内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- IOS开发小记-内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- iOS开发ARC内存管理技术要点
本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...
- (转)iOS开发ARC内存管理技术要点
转自:http://www.cnblogs.com/flyFreeZn/p/4264220.html 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automati ...
- iOS开发——高级技术&签名机制
签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...
- iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)
iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...
随机推荐
- Linux Mint 17.2个性化配置
一.开启root 帐号登陆 设置一个口令,使用: sudo passwd root 当你使用完毕后屏蔽root帐号使用以下命令锁定root帐号 : sudo passwd -l root 如何在终端模 ...
- 程序员 10Tips
理解技术债务 技术债务就像信用卡一样,会有很高的利息率,时间越长,修复所花的代价就越大,程序员对这个要有深刻的认识.同时团队应该培养一种保证设计质量的文化,应当鼓励重构.同时也应当鼓励其它有关代码质量 ...
- CodeForces 139C Literature Lesson(模拟)
这个题,读懂了就是水,读不懂就没办法下手,论英语阅读的重要性...只有五种形式,第一种万能型aaaa,是另外3种的特殊情况,第二种克莱里林四行打油诗aabb形式,第三种是交替的abab形式,第四种是封 ...
- 转:HTML与URL两种录制模式分析
Loadrunner的Virtual User Generator 提供人脚本的录制功能,对于初学者来说,这大大的降低了编写脚本的门槛,loadrunner提供两种录制脚本的方式:Html_based ...
- 安卓图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图
前面几篇博客中都是调用ChartFactory.get***Intent()方法,本节讲的内容调用ChartFactory.get***View()方法,这个方法调用的结果可以嵌入到任何一个Activ ...
- oracle监听无法启动
昨天再监听里新加了个地址,重启电脑后监听无法启动,删除新加地址就好了 # listener.ora Network Configuration File: d:\oracle\product\10.2 ...
- iOS之UILabel自适应大小
//初始化一个label self.label=[[UILabel alloc] init]; //设置自动行数与字符换行 [self.label setNumberOfLines:0]; //给la ...
- The Willpower Instinct
https://book.douban.com/subject/7043452/ 1.冥想2.健康饮食(低GI.素食为主,未加工食物为主).低GI食物使血糖稳定(蛋白.麦片.粗纤谷类.豆类.水果蔬菜) ...
- mysql trouble shooting---- 从库停止同步lock_wait_timeout_exceeded_try_restarting_transaction
问题描述: 数据库从库停止同步. 问题分析: show slave status\G;(也可使用show full processlist) 显示 某个update语句出错,Lock wait tim ...
- iOS利用通知(NSNotification)进行传值
通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便.便捷,一个简单的Demo实现通知的跳转传值. iOS通知传值的使用 输入所要发送的信息 ,同时将label的值通过button方法 ...