码迷,mamicode.com
首页 > 移动开发 > 详细

iOS-NSURLCache内存缓存

时间:2015-09-19 23:56:48      阅读:362      评论:0      收藏:0      [点我收藏+]

标签:

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内存缓存

标签:

原文地址:http://www.cnblogs.com/jiafuyang/p/4822441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!