有时候。对同一个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



NSURLCache、网络监測状态的更多相关文章

  1. Android实践--监測网络状态

    Android 监測网络状态      我们在使用Android手机时候,一些APP须要网络环境才干执行,所以手机须要可用的网络,无论是2G.3G或者WIFI.甚至有一些比較耗流量的APP仅仅能在WI ...

  2. 网络状态监測之 Reachability的使用

    先下载 Reachability开源库地址: (一)git hub: https://github.com/tonymillion/Reachability (二)我自己改动的:http://down ...

  3. 使用NDIS驱动监測以太网络活动

    转载自: http://blog.csdn.net/ddtpower/article/details/656687   本论文提供了NDIS的主要的理解,应用程序怎样与驱动程序交互.发挥驱动程序最佳性 ...

  4. 使用HTML5监測站点性能

    在这个信息爆炸的互联网时代,越来越多的人缺少了等待的耐心.站点性能对于一个站点来说越来越重要.下面为监控到的站点打开时间对跳出率的影响: 当站点打开时间在0-1秒时,跳出率为12% 当站点打开时间在1 ...

  5. Oracle 网络监听配置管理

    Oracle 网络配置与管理 详细信息可以参考以下信息: [学习目标] 一.原理解析 二.配置侦听器(LISTENER) 三.配置客户端网络服务名 四.关于注册 五.查询某服务是静态还是动态注册 Or ...

  6. 从零开始学 Web 之 HTML5(三)网络监听,全屏,文件读取,地理定位接口,应用程序缓存

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  7. 基于Unity3D云人脸监測技术

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师.CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  8. iOS:Reachability网络监听

    iOS利用Reachability确认网络环境3G/WIFI 开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息.如果没有处理它们,是不会通过Apple的审查的,一般情况下,可以把网络监 ...

  9. Atitit.软件仪表盘(4)--db数据库子系统-监測

    Atitit.软件仪表盘(4)--db数据库子系统-监測 连接数::: 死锁表列表:死锁基础列表(近期几条记录,时间,sql等) 3.对server进行监控.获取CUP.I/O使用情况   4.对数据 ...

随机推荐

  1. HDU 2421

    由算术基本定理N=p1^e1*p2^e2....ps^es,可知一个素的因子个数为(e1+1)*(e2+1)*...*(es+1). 而N的一人因子必定也有n=p1^k1*p2^k2....*ps^k ...

  2. hello world to php( mac 配置 xmapp virtual host)

    一.安装xmapp.安装完以后查看,服务是否都能启动(数据库和server) 二.配置自己的virtualhost       1.系统host文件加入server的域名(在浏览器中输入域名后会先通过 ...

  3. Oracle 学习笔记 13 -- 控制用户权限

    数据库控制语言的功能室控制用户对数据库的存取权限. 用户对某类数据具有何种操作权限是有DBA决定的.Oracle 通过GRANT语句完毕权限的授予,通过REVOKE语句完毕对权限的收回. 权限分为系统 ...

  4. [hihocoder #1384] Genius ACM 解题报告(倍增)

    题目链接:http://hihocoder.com/problemset/problem/1384 题目大意: 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M ...

  5. winforms控件

     我们在开发窗体应用时,控件是必不可少的今天我们就来认识一下控件 在认识控件之前还要先来认识一下窗体具体如下: 认识窗体和控件 窗体                                   ...

  6. CBO基础概念

    CBO基础概念 CBO:评估 I/O,CPU,网络(DBLINK)等消耗的资源成本得出 一.cardinality cardinality:集合中包含的记录数.实际CBO评估目标SQL执行具体步骤的记 ...

  7. Ajax :六个全局事件

    加载请求: .ajaxStart() 和 .ajaxstop() $(document).ajaxStart(function(){ $('.loading').show(); }).ajaxStop ...

  8. 用Beamer做Slides

    学术用幻灯片,首选还是latex.但是问题来了,Beamer这个latex幻灯模板还需要很多自定义设置.于是找了网上一些自己觉得好的例子. http://www.latexstudio.net/ind ...

  9. 学习es6 setter/getter研究

    1.背景 在ES6中,我们对类的定义如下 class Person { // 构造函数 constructor (name) { // 属性初始化 this.name = name; } // 成员方 ...

  10. Servlet学习(三)——实例:用户登录并记录登陆次数

    1.前提:在Mysql数据库下建立数据库web13,在web13下创建一张表user,插入几条数据如下: 2.创建HTML文件,命名为login,作为登录界面(以post方式提交) <!DOCT ...