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 ...
随机推荐
- 使用cgroups限制MongoDB的内存使用
cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等). 这个项目最早是由Goo ...
- ChartCtrl源码剖析之——CChartLegend类
CChartLegend类用来绘制每一个波形的描述信息,它处于该控件的区域,如下图所示: CChartLegend类的头文件. #if !defined(AFX_CHARTLEGEND_H__CD72 ...
- 03_隐式意图打开activity
想让第一个activity把第二个activity打开的话,在清单文件里面声明一下并且 右键Debug As Android Application居然没有报错 mimeType 讲HTML的时候就 ...
- 【黑金教程笔记之003】【建模篇】akuei2的Verilog hdl心路
Verilog hdl不是“编程”是“建模” Verilog hdl语言是一种富有“形状”的语言. 如果着手以“建模”去理解Verilog hdl语言,以“形状”去完成Verilog hdl语言的设计 ...
- htm 与 html 的区别
htm 与 html 的区别 前者是超文本标记(Hypertext Markup) 后者是超文本标记语言(Hypertext Markup Language) 可以说 htm = html 同时,这两 ...
- VS2010编译错: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403...的解决方法
最近拿到一个别人的工程,是使用VS.net创建的,而我的机器上只有vs2010,于是用自带的转换工具将它转换成vs2010的工程,转换之前我就很担心,怕转换完后会出问题,但是没有办法,我实在是 ...
- centos mysql数据库忘记密码修改
1.vim /etc/my.cnf 2.在[mysqld]中添加 skip-grant-tables 例如: [mysqld]skip-grant-tablesdatadir=/var/lib/mys ...
- 初学Ajax
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...
- AJPFX简述java语言现状和发展
作为一种最流行的网络编程语言之一,java语言在当今信息化社会中发挥了 重要的作用.Java语言具有面向对象.跨平台.安全性.多线程等特点,这使得java成为许多应用系统的理想开发语言.java应用在 ...
- (六)Mybatis总结之延迟加载
应用场景: i.假如一个用户他有N个订单(N>=1000),那么如果一次性加载的话,一个用户对象的订单集合OrderList里面就会有1000多个Order的对象.计算:一个订单对象里面数据有多 ...