iOS中的NSURLCache数据缓存类用法解析
在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 *)sharedurlcache;
//设置自定义的nsurlcache作为应用缓存管理对象
+ (void)setsharedurlcache:(nsurlcache *)cache;
//初始化一个应用缓存对象
/*
memorycapacity 设置内存缓存容量
diskcapacity 设置磁盘缓存容量
path 磁盘缓存路径
内容缓存会在应用程序退出后 清空 磁盘缓存不会
*/
- (instancetype)initwithmemorycapacity:(nsuinteger)memorycapacity diskcapacity:(nsuinteger)diskcapacity diskpath:(nullable nsstring *)path;
//获取某一请求的缓存
- (nullable nscachedurlresponse *)cachedresponseforrequest:(nsurlrequest *)request;
//给请求设置指定的缓存
- (void)storecachedresponse:(nscachedurlresponse *)cachedresponse forrequest:(nsurlrequest *)request;
//移除某个请求的缓存
- (void)removecachedresponseforrequest:(nsurlrequest *)request;
//移除所有缓存数据
- (void)removeallcachedresponses;
//移除某个时间起的缓存设置
- (void)removecachedresponsessincedate:(nsdate *)date ns_available(10_10, 8_0);
//内存缓存容量大小
@property nsuinteger memorycapacity;
//磁盘缓存容量大小
@property nsuinteger diskcapacity;
//当前已用内存容量
@property (readonly) nsuinteger currentmemoryusage;
//当前已用磁盘容量
@property (readonly) nsuinteger currentdiskusage;
简单例子:
#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] 请求完成
我们看到没有“将缓存输出”一项,请求到的数据是第一次请求的累积,也就是第二次是从内存中获取数据的。