有时候。对同一个URL请求多次。返回的数据可能一样的;

比方server上的某张图片。不管下载多少次,返回的数据都是一样的。可是这些情况会造成下面问题:

1,用户流量的浪费。

2。程序响应速度不够快

为了提高程序的响应速度,能够考虑使用缓存(内存缓存\硬盘缓存)
硬盘缓存也是沙盒缓存;

第一次请求数据:

1,client优先会去内存缓存中检測有无缓存;

2,然后再去硬盘缓存中检測有无缓存。

3,再去server请求数据;

当server返回数据时。须要做下面步骤

1,使用server的数据(比方解析、显示)

2,将server的数据缓存到硬盘(沙盒)

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

一、假设程序并没有被关闭,一直在执行:

内存缓存中有数据;硬盘缓存中有数据;

假设再次请求数据,直接使用内存缓存中的数据就可以。

二、假设程序又一次启动

内存缓存已经消失。没有数据; 硬盘缓存依然存在。还有数据;

一旦从硬盘缓存中读取数据,内存缓存中又有数据。

缓存的实现:

1。一般仅仅对GET请求进行缓存,不必对POST请求进行缓存;

GET请求一般用来查询数据。

POST请求通常是发大量数据给server处理(变动性比較大)

2,在IOS中,能够使用NSURLCache类缓存数据:

在IOS5前,仅仅支持
内存缓存;

在IOS開始。
同一时候支持内存缓存和硬盘缓存

3,NSURLCache了解

缓存原理:
一个NSURLRequest相应一个NSCachedURLResponse。在缓存中去找那个请求相应的响应。

缓存技术: 数据库;

缓存GET请求

要想对某个GET请求进行数据缓存,很easy

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 2.设置缓存策略(有缓存就用缓存。没有缓存就又一次请求)

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

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

缓存策略:

IOS对NSURLRequest提供了7中缓存策略:(实际上能用的仅仅有4种)

1,NSURLRequestUseProtocolCachePoily  //默认的缓存策略(取决于协议)

2。NSURLRequestReloadIgnoringLocalCacheData  //忽略缓存,又一次请求;

3,NSURLRequestReloadIgnoringLocalAndRemoteCacheData  //未实现

4,NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData ; //忽略缓存,又一次请求;

5,NSURLRequestReturnCacheDataElseLoad   //有缓存就用缓存。没有缓存就又一次请求

6,NSURLRequestReturnCacheDataDonLoad   //有缓存就用缓存。没有缓存就不发请求,当做请求出错处理(用于离线模式)

7,NSURLRequestReloadRevalidatingCacheData  //未实现

NSURLCache几个方法:

取得某个请求的缓存

- (NSCacheURLResponse *)cacheResponseForRequest:(NSURLRequest *)request;

消除某个请求的缓存

- (void)removeCacheReponseForRequest:(NSURLRequest *)request;

消除全部缓存

- (void)removeAllCacheResponses;

缓存的使用注意:

缓存看起来非常美好,但须要慎重使用;

1,假设请求某个URL的返回数据;

常常更新:不能用缓存!

比方股票、彩票数据

一成不变:果断用缓存

偶尔更新:能够定期更改缓存策略 或者清除缓存

2,假设大量使用缓存,会越积越大,
建议定期清除缓存;

#import "HMViewController.h"

#import "Reachability.h"

@interface HMViewController ()

@property (nonatomic, strong) Reachability *conn;

@end

@implementation HMViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

self.conn = [Reachability reachabilityForInternetConnection];

[self.conn startNotifier];

}

- (void)dealloc

{

[self.conn stopNotifier];

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

- (void)networkStateChange

{

[self checkNetworkState];

}

//
用WIFI

// [wifi currentReachabilityStatus] != NotReachable

// [conn currentReachabilityStatus] != NotReachable

// 没实用WIFI,
仅仅用了手机网络

// [wifi currentReachabilityStatus] == NotReachable

// [conn currentReachabilityStatus] != NotReachable

// 没有网络

// [wifi currentReachabilityStatus] == NotReachable

// [conn currentReachabilityStatus] == NotReachable

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

}

- (void)checkNetworkState

{

// 1.检測wifi状态

Reachability *wifi = [Reachability reachabilityForLocalWiFi];

// 2.检測手机能否上网络(WIFI\3G\2.5G)

Reachability *conn = [Reachability reachabilityForInternetConnection];

// 3.推断网络状态

if ([wifi currentReachabilityStatus] != NotReachable) { //
有wifi

NSLog(@"有wifi");

} else if ([conn currentReachabilityStatus] != NotReachable) { //
没有使用wifi,
使用手机自带网络进行上网

NSLog(@"使用手机自带网络进行上网");

} else { //
没有网络

NSLog(@"没有网络");

}

}

@end



最新文章

  1. NOIP提高模拟题 完全平方数
  2. kafka - advertised.listeners and listeners
  3. 序列化 Serializable
  4. 【C#】C# 实现发送手机短信
  5. 安装交叉编译器arm-linux-gcc
  6. 自学Java过程
  7. Ehcache - hello world
  8. 常用数据结构及复杂度 array、LinkedList、List、Stack、Queue、Dictionary、SortedDictionary、HashSet、SortedSet
  9. [非技术参考]C#基础:使用Thread创建线程(1)
  10. CCNP交换实验(7) -- NAT
  11. HashMap和Hashtable的同和不同
  12. matcaffe的blob维度顺序
  13. Vmware虚拟机安装Ubuntu 16.04 LTS(长期支持)版本+VMware tools安装
  14. vue 2.0 路由切换以及组件缓存源代码重点难点分析
  15. poj1416
  16. brew faq:call ISHELL_GetJulianDate always return 1980 1 6
  17. SQL Server中将多行数据拼接为一行数据并且有特殊字符
  18. SpringBoot读取自定义配置文件
  19. 第一课——从main到WinMain
  20. 一个.net Cookie组件的bug引发的题外话

热门文章

  1. [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)
  2. Qt之二维码扫描
  3. VC6.0VB6.0 Scratch等软件
  4. base标签的作用是什么
  5. [poj 3349] Snowflake Snow Snowflakes 解题报告 (hash表)
  6. BZOJ 2179 FFT模板
  7. SSIS故障排除
  8. 银行bank系统项目实践
  9. python 3.x 学习笔记10 (析构函数and继承)
  10. jq不懂的地方