NSURLCache缓存

来源:互联网 发布:雅思托福的区别知乎 编辑:程序博客网 时间:2024/06/06 23:56
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 = [NSURLURLWithString:paramURLAsString];

   //创建一个请求

   self.request=[NSMutableURLRequestrequestWithURL:self.url

                                          cachePolicy:NSURLRequestUseProtocolCachePolicy

                             timeoutInterval:30.0f];

   [self.myWebViewloadRequest: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.myWebViewloadRequest: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", (unsignedlong)[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]请求完成

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