NSURLCache、网络监測状态


有时候。对同一个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開始。 同一时候支持内存缓存和硬盘缓存

3NSURLCache了解

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

缓存技术: 数据库;


缓存GET请求

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

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

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

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

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


缓存策略:

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

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

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

3NSURLRequestReloadIgnoringLocalAndRemoteCacheData  //未实现

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

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

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

7NSURLRequestReloadRevalidatingCacheData  //未实现


 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




posted @ 2017-06-13 16:50  yangykaifa  阅读(144)  评论(0编辑  收藏  举报