在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制。使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。下面将介绍如何在IOS设备中进行缓存。

 

内存缓存我们可以使用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多次请求。看下面代码:

#import

@interface ViewController : UIViewController

@property (strong, nonatomic) NSURLConnection *connection;

@property (strong, nonatomic) NSURLCache *urlCache;

@property (strong, nonatomic) NSURL *url;

@property (strong, nonatomic) NSMutableURLRequest *request;

- (IBAction)reloadWebView:(UIButton *)sender;

@end

 

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

NSString *paramURLAsString= @"http://blog.sina.com.cn/u/2526279194";

self.urlCache = [NSURLCache sharedURLCache];

[self.urlCache setMemoryCapacity:1*1024*1024];

//创建一个nsurl

self.url = [NSURL URLWithString:paramURLAsString];

//创建一个请求

self.request=[NSMutableURLRequest requestWithURL:self.url

cachePolicy:NSURLRequestUseProtocolCachePolicy

timeoutInterval:30.0f];

[self.myWebView loadRequest:self.request];

}

这个例子中,我们请求url为http://blog.sina.com.cn/u/2526279194的网站。如果这个url被缓存了,我们直接从缓存中获取数据,否则从http://blog.sina.com.cn/u/2526279194站点上重新获取数据。我们设置了缓存大小为1M。

 

- (IBAction)reloadWebView:(UIButton *)sender {

//从请求中获取缓存输出

NSCachedURLResponse *response =[self.urlCache cachedResponseForRequest:self.request];

//判断是否有缓存

if (response != nil){

NSLog(@"如果有缓存输出,从缓存中获取数据");

[self.request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];

}

[self.myWebView loadRequest:self.request];

self.connection = nil;

NSURLConnection *newConnection = [[NSURLConnection alloc] initWithRequest:self.request

delegate:self

startImmediately:YES];

self.connection = newConnection;

}

使用下面代码,我将请求的过程打印出来

- (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(@"请求失败");

}

@end

第一次打印结果如下

2013-01-31 15:28:29.923 NSURLCacheDemo[27848:907] 即将发送请求

2013-01-31 15:28:30.043 NSURLCacheDemo[27848:907] 将接收输出

2013-01-31 15:28:30.045 NSURLCacheDemo[27848:907] 接受数据

2013-01-31 15:28:30.047 NSURLCacheDemo[27848:907] 数据长度为 = 30047

2013-01-31 15:28:30.095 NSURLCacheDemo[27848:907] 接受数据

2013-01-31 15:28:30.098 NSURLCacheDemo[27848:907] 数据长度为 = 3575

2013-01-31 15:28:30.102 NSURLCacheDemo[27848:907] 接受数据

2013-01-31 15:28:30.104 NSURLCacheDemo[27848:907] 长度为 = 1482

2013-01-31 15:28:30.105 NSURLCacheDemo[27848:907] 将缓存输出

2013-01-31 15:28:30.107 NSURLCacheDemo[27848:907] 请求完成

第二次点击打印结果如下

2013-01-31 15:28:31.599 NSURLCacheDemo[27848:907] 如果有缓存输出,从缓存中获取数据

2013-01-31 15:28:31.607 NSURLCacheDemo[27848:907] 即将发送请求

2013-01-31 15:28:31.840 NSURLCacheDemo[27848:907] 将接收输出

2013-01-31 15:28:31.843 NSURLCacheDemo[27848:907] 接受数据

2013-01-31 15:28:31.845 NSURLCacheDemo[27848:907] 数据长度为 = 35104

2013-01-31 15:28:31.846 NSURLCacheDemo[27848:907] 请求完成

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

iOS-NSURLCache内存缓存的更多相关文章

  1. 内存缓存的使用Demo

    使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...

  2. IOS - 开发之内存缓存机制

    使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...

  3. iOS开发之内存缓存机制

    使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...

  4. 玩转iOS开发 - 数据缓存

    Why Cache 有时候.对同一个URL请求多次,返回的数据可能都是一样的,比方server上的某张图片.不管下载多少次,返回的数据都是一样的. 上面的情况会造成下面问题 (1)用户流量的浪费 (2 ...

  5. iOS开发网络缓存原理

    一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...

  6. iOS - ImageCache 网络图片缓存

    1.ImageCache 使用内存缓存方式: 使用沙盒缓存方式: 使用网络图片第三方库方式: SDWebImage: iOS 中著名的网络图片处理框架 包含的功能:图片下载.图片缓存.下载进度监听.g ...

  7. iOS的内存分析和内存管理

    iOS的内存分析和内存管理 [内存管理]一直是iOS开发中的一个重点. 本文就带你从内存分析开始一步步了解内存的占用情况,从真实的情况中领悟真正项目开发过程中的内存的使用情况. 注:本文默认你熟悉 M ...

  8. iOS html5使用缓存并及时更新方案总结

    最近一段时间研究了一下H5在iOS移动端表现时使用缓存并可及时更新方案,总结如下: 一.使用Webview自带缓存机制 当我们使用webview加载html资源时的,本质上就是一个向服务器索取资源的h ...

  9. iOS app内存分析套路

    iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...

随机推荐

  1. .Net程序员玩转Android系列之三~快速上手(转)

    转自http://www.cnblogs.com/HouZhiHouJueBlogs/p/3962122.html 快速环境搭建和Hello World 第一步:JAVA SDK(JDK)的安装: 官 ...

  2. oracle建库及plsql建表空间的用法

    所有程序—>ORACLE-JHEMR----------->配置和移植工具----->DataBase Configuration Assistant-------中间就需要改一个数 ...

  3. 转 Warning:MongoDB Replica Sets配置注意事项

    我们知道,MongoDB不提供单机的数据安全性,取而代之的是提供了Replica Sets的高可用方案.官方文档中提到的案例是三个节点组成的Replica Sets,这样在其中任何一个节点宕机后都会自 ...

  4. 原创:整理编辑jQuery全部思维导图【附下载地址】

    主图 全部图已经打包:下载地址 2. 3. 4. 5. 6. 附上一点简单说明 Dom对象和jquer对象之间的转化 如何将一个jquery对象转换为DOM对象? test是一个span元素 var ...

  5. API 进程、线程函数

    CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 ConnectNamedPipe 指 ...

  6. 基于SOCK4网络协议的代理服务器端代码示例

    //********************************************************************** #include <stdio.h> #i ...

  7. hdu 4606 Occupy Cities

    http://acm.hdu.edu.cn/showproblem.php?pid=4606 两点之间如果有线段相隔的话,他们的最短路就需要经过线段的端点 把所有线段的端点也加入点数组中,求任意两个点 ...

  8. C++-模板的声明和实现为何要放在头文件中

    源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 ...

  9. POJ 3648 2-sat

    题目大意: 有一对新人结婚,邀请n对夫妇去参加婚礼. 有一张很长的桌子,人只能坐在桌子的两边,还要满 足下面的要求:1.每对夫妇不能坐在同一侧 2.n对夫妇 之中可能有通奸关系(包括男男,男女,女女) ...

  10. poj 1742 Coins (动态规划,背包问题)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 32977   Accepted: 11208 Descripti ...