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] 请求完成

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



相关阅读:
基于递归实现的php树形菜单代码
利用CSS span实现双语菜单的方法教程
PHP批量生成静态HTML的简单原理和方法
Win10最新预览版怎么还原以前Win7或Win8?
MySQL数学函数简明总结
MySQL页面访问统计及排名情况
JavaScript实现随机替换图片的方法
iOS应用中发送HTTP的get请求以及HTTP异步请求的方法
mysql动态游标学习(mysql存储过程游标)
Win8.1如何关闭动态磁贴让耳朵清静下
win7 64位系统提示"Windows7不能识别网络打印机"的故障原因及解决方法
C#判断某程序是否运行的方法
Win10/Win8.1原生支持FFmpeg:视频格式通吃
jQuery事件绑定on()与弹窗实现代码
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 新昌-池州 德阳-玉环 绥化-靖江 江门-珠海 辽阳-周口 郑州-哈尔滨 鹰潭-海盐 成都-绥化 中山-莱西 广安-菏泽 常熟-湘潭 蓟县-宿州 都江堰-鹰潭 章丘-大同 抚顺-遂宁 安庆-石嘴山 玉树-西安 广元-萍乡 鸡西-肇庆 寿光-上虞 奉化-舟山 威海-东营 阿克苏-义马 清远-广元 马鞍山-仪征 桂林-汉中 即墨-盐城 吐鲁番-沧州 锦州-靖江 芜湖-那曲 昭通-黄冈 威海-汉中 赤峰-莱芜 荆门-镇江 淮安-大连 镇江-崇明 太原-云浮 永康-哈密 德清-楚雄 昆山-珠海 济宁-石家庄 衡阳-新泰 鄂州-大连 重庆-海北 泰安-如东 巴中-漯河 萍乡-惠州 汕头-伊春 丽江-阳江 宿州-新余 南充-宝鸡 伊春-晋中 黄山-阜阳 呼和浩特-大同 哈密-铜仁 绍兴-武安 丽水-日照 呼伦贝尔-合肥 乌鲁木齐-衢州 金昌-嘉善 莱芜-兖州 芜湖-青州 济南-平湖 珠海-莱芜 蚌埠-南京 天水-桐乡 果洛-海口 滕州-偃师 绥化-鹰潭 包头-贺州 眉山-阿勒泰 菏泽-海南 深圳-玉林 鄂州-蓟县 海门-黄石 台州-肥城 肥城-岳阳 温州-湖州 宣城-瑞安 重庆-武汉 轵城-白合 深圳北-福田 茂舍祖-乐善村 武隆-诸暨 集宁南-赣州 阆中-铜仁 丹阳北-曲阜东 普湾-双城北 汉口-如皋 邹城-新余 南大庙-官高 汤阴-汝州 昌图-安阳 开鲁-查干芒和 嘉兴南-德清 邢台东-秦皇岛 西宁-大板 许昌东-永福南 哈尔滨-滦县 嘉兴-随州 杭州-枣庄西 黄梅-信丰 公主岭-海北 诸暨-嘉善 水洞-砬子河 通辽-林源 青岛北-虞城县 定西-息县 徐州-奎屯 龙门河-克东 铁力-大虎山 镇江-邳州 包头东-绥中 萧县北-武夷山东 肃宁-宝鸡 衡阳东-诸暨 西峡-武穴 武义-江山 济源-沁县 锦州-碾子山 苏州园区-淮南东 长征-东湾 武昌-咸宁南 讷尔克气-安达 杏树屯-青堆 东安东-南宁东 铁力-伊春 杨陵-甘洛 襄阳东-鄂州 融安-肇庆 宜昌东-信阳东 虎门-岳阳东 新开-海城 达州-巴山 巴楚-伊宁 建三江-朗乡 子洲-民权 安康-米易 林源-徐州 南杂木-水洞 玉屏-泰山 石家庄-滁州 陇县-火烧寨 玉山-泰和 桥头-草河口 苏州-三门县 涵江-义乌 白城-普兰店 太原-藁城 太原-甘谷 定远-泰安 镇平-永康 邓州-南阳 包头-保定 萍乡-玉林 普兰店-通北 沈阳-商丘 正定机场-郑州东 三门峡-成都 建宁县北-漳州

Copyright © 2016 phpStudy |