NSURLCache内存缓存

转自:http://blog.sina.com.cn/s/blog_9693f61a01016t4w.html

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


 内存缓存我们可以使用sdk中的NSURLCache类。NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型。

 

 1NSURLRequestUseProtocolCachePolicyNSURLRequest默认的cachepolicy,使用Protocol协议定义。

 

 2NSURLRequestReloadIgnoringCacheData忽略缓存直接从原始地址下载。

 

 3NSURLRequestReturnCacheDataElseLoad只有在cache中不存在data时才从原始地址下载。

 

 4NSURLRequestReturnCacheDataDontLoad只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式;

 

 5NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。

 

 6NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。

 

 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

{

   [superviewDidLoad];

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

   self.urlCache =[NSURLCachesharedURLCache];

  

   [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.urlCachecachedResponseForRequest: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;

}


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

- (voidconnection:(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.923NSURLCacheDemo[27848:907] 即将发送请求

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

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

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

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

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

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

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

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

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

第二次点击打印结果如下

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值