美文网首页
iOS 网络请求url的缓存策略

iOS 网络请求url的缓存策略

作者: MIUI轩 | 来源:发表于2017-05-21 10:10 被阅读0次

url缓存策略

问题原因:
  • 多次重复请同一个url求造成流量浪费
  • 程序相应速度不快
解决办法
  • 为了提高性能,可以考虑使用缓存(内存缓存/硬盘缓存)
  • 客户端检测有无内存缓存/有无硬盘缓存,如果没有则请求服务器
当服务器第一次返回数据时,需要做以下步骤
  • 使用服务器的数据(比如解析、显示)
  • 服务器的数据缓存到硬盘(沙盒)

此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据。

再次请求数据分为两种情况:

(1)如果程序并没有被关闭,一直在运行

那么此时内存缓存中有数据,硬盘缓存中有数据。如果此时再次请求数据,直接使用内存缓存中的数据即可

(2)如果程序重新启动

那么此时内存缓存已经消失,没有数据,硬盘缓存依旧存在,还有数据。如果此时再次请求数据,需要读取内存中缓存的数据。

提示:从硬盘缓存中读取数据后,内存缓存中又有数据了

缓存实现

  • 说明:

由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)
因此一般只对GET请求进行缓存,而不对POST请求进行缓存
在iOS中,可以使用NSURLCache类缓存数据
iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存

2.NSURLCache

iOS中得缓存技术用到了NSURLCache类。
缓存原理:一个NSURLRequest对应一个NSCachedURLResponse
缓存技术:把缓存的数据都保存到数据库中。

3.NSURLCache的常见用法

(1)获得全局缓存对象(没必要手动创建)NSURLCache *cache = [NSURLCache sharedURLCache];
(2)设置内存缓存的最大容量(字节为单位,默认为512KB)- (void)setMemoryCapacity:(NSUInteger)memoryCapacity;
(3)设置硬盘缓存的最大容量(字节为单位,默认为10M)- (void)setDiskCapacity:(NSUInteger)diskCapacity;
(4)硬盘缓存的位置:沙盒/Library/Caches
(5)取得某个请求的缓存- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;
(6)清除某个请求的缓存- (void)removeCachedResponseForRequest:(NSURLRequest *)request;
(7)清除所有的缓存- (void)removeAllCachedResponses;

4.缓存GET请求

要想对某个GET请求进行数据缓存,非常简单

   NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置缓存策略

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存

5.iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)

NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
NSURLRequestReloadRevalidatingCacheData // 未实现

6.缓存的注意事项

缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:

(1)经常更新:不能用缓存!比如股票、彩票数据

(2)一成不变:果断用缓存

(3)偶尔更新:可以定期更改缓存策略 或者 清除缓存

提示:如果大量使用缓存,会越积越大,建议定期清除缓存

#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 网络请求url的缓存策略

    url缓存策略 问题原因: 多次重复请同一个url求造成流量浪费 程序相应速度不快 解决办法 为了提高性能,可以考...

  • NSURLRequest

    iOS中URL缓存策略 涉及相关类(未深度研究的)

  • URL

    URL加载系统:缓存、Cookies与协议 缓存: URL为请求提供了基于磁盘缓存和内存缓存,缓存减少了应用对网络...

  • [转]数据本地化-缓存处理

    [转]iOS开发网络篇—数据缓存一、关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是...

  • AFNetworking二次封装

    使用AFNetworking实现网络请求,同时集成YYCache实现缓存策略. 网络请求类 WMNetwork.h...

  • NSURLCache缓存的使用

    缓存策略 App 中有3种网络缓存存策略(只对 get 请求做缓存) 1.不返回缓存数据,实时返回接口数据 2.首...

  • 网络请求缓存策略

    缓存NSURLCache详解和使用 1.参考此篇详细博客地址 2.NSURLRequestCachePolicy的...

  • iOS架构设计-URL缓存(上)

    iOS架构设计-URL缓存(上) iOS架构设计-URL缓存(上)

  • iOS架构设计-URL缓存(下)

    iOS架构设计-URL缓存(下) iOS架构设计-URL缓存(下)

  • Android-图片加载框架(三级缓存)

    所谓三级缓存指的是内存、磁盘缓存、网络加载 。bitmap获取存取逻辑大致如下:1.获取 url ,请求网络加载。...

网友评论

      本文标题:iOS 网络请求url的缓存策略

      本文链接:https://www.haomeiwen.com/subject/nqpmxxtx.html