今天要介绍的是Reachability文件夹下的AFNetworkReachabilityManager类。通过字面意思我们就可以知道AFNetworkReachabilityManager是用来监测网络状态,网络状态管理的类,他可以通过设置状态改变回调来获得当前网络状态。

下面我们还是先看.h文件。

上边枚举表示的是网络状态,网络状态有以上几种,分别是未知,不可用,无线广域网连接,WiFi连接。

以上是包含的属性

networkReachabilityStatus当前网络的状态,就是枚举中的类型

reachable网络是不是当前可用的

reachableViaWWAN通过WWAN连接的网络是不是当前可用的

reachableViaWiFi通过WIFI连接的网络是不是当前可用的

下面是初始化方法

这个是单例,通过dispatch_once_t保证只执行一次,单线程。

在上边单例里调用这个方法,manager方法中通过默认的socket地址创建并返回一个网络状态管理对象。sin_family表示协议族,AF_INET表示TCP/IP协议族的地址,sockaddr_in是一个结构体,bzero是将结构体清零,sin_len表示的是大小,根据版本的不同给地址赋不同的值。

下面调用的是managerForAddress方法.

在这个方法里,通过传入一个socket地址进行初始化。生成SCNetworkReachabilityRef,然后调用initWithReachability方法,最终返回manager对象。下面是initWithReachability方法

在这里将网络状态初始化设置为 unknown 未知 。

- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability NS_DESIGNATED_INITIALIZER;

由于在声明的时候有NS_DESIGNATED_INITIALIZER,所以最终都会调用该方法。

还有最后一种方法是managerForDomain

该方法可以根据特定的域进行初始化。初始化结束后,需要设置网络状态改变的回调,在开启监听之后,会将网络状态回调给外部。

初始化相关方法介绍之后,介绍一下监听相关方法

开启监听方法

先是停止监听,然后在block中将status回调出去,声明一个结构体,设置回调,通过runloop监测网络状态,最后获取当前的网络状态,调用callback.

如果没有设置回调,可以通过以上注册通知的方式,接收到网络状态的变化。获取当前的status,然后返回status,同时发送一个通知。

下面就是停止监听方法

停止监听就是取消在Main Runloop当中的监听。

当我们在使用的这个类进行网络状态监听的时候使用方法,举例

AFNetworkReachabilityManager *networkManager = [AFNetworkReachabilityManager sharedManager];

[networkManager startMonitoring];

[networkManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)

{

switch (status){

case AFNetworkReachabilityStatusNotReachable:

// do something

break;

case AFNetworkReachabilityStatusReachableViaWWAN:

// do something

break;

case AFNetworkReachabilityStatusReachableViaWiFi:

// do something

break;

default:

break;

}

}];

如有转载,请注明出处。

参考文章:http://zeeyang.com/2016/05/23/AFNetWorking-four/

AFNetworking (3.1.0) 源码解析 <三>的更多相关文章

  1. AFNetworking2.0源码解析<三>

    本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程 ...

  2. AFNetworking (3.1.0) 源码解析 <六>

    这次继续介绍文件夹Serialization下的类AFURLResponseSerialization.这次介绍就不拆分了,整体来看一下.h和.m文件. 协议AFURLResponseSerializ ...

  3. AFNetworking (3.1.0) 源码解析 <五>

    这次主要开始讲解一下文件夹Serialization下的类AFURLRequestSerialization. AFURLRequestSerialization类遵守`AFURLRequestSer ...

  4. AFNetworking (3.1.0) 源码解析 <一>

    首先说一下AFNetworking的github地址:GitHub - AFNetworking/AFNetworking: A delightful networking framework for ...

  5. AFNetworking (3.1.0) 源码解析 <四>

    这次主要看一下文件夹Security中的类AFSecurityPolicy----安全策略类. AFSecurityPolicy主要的作用是验证HTTPS请求证书的有效性,在iOS9之后,默认不能发送 ...

  6. AFNetworking (3.1.0) 源码解析 <二>

    这次讲解AFHTTPSessionManager类,按照顺序还是先看.h文件,注释中写到AFHTTPSessionManager是AFURLSessionManager的子类,并且带有方便的HTTP请 ...

  7. solr&lucene3.6.0源码解析(三)

    solr索引操作(包括新增 更新 删除 提交 合并等)相关UML图如下 从上面的类图我们可以发现,其中体现了工厂方法模式及责任链模式的运用 UpdateRequestProcessor相当于责任链模式 ...

  8. Heritrix 3.1.0 源码解析(三十七)

    今天有兴趣重新看了一下heritrix3.1.0系统里面的线程池源码,heritrix系统没有采用java的cocurrency包里面的并发框架,而是采用了线程组ThreadGroup类来实现线程池的 ...

  9. solr&lucene3.6.0源码解析(四)

    本文要描述的是solr的查询插件,该查询插件目的用于生成Lucene的查询Query,类似于查询条件表达式,与solr查询插件相关UML类图如下: 如果我们强行将上面的类图纳入某种设计模式语言的话,本 ...

随机推荐

  1. (转) ThinkPHP模板自定义标签使用方法

    这篇文章主要介绍了ThinkPHP模板自定义标签使用方法,需要的朋友可以参考下  转之--http://www.jb51.net/article/51584.htm   使用模板标签可以让网站前台开发 ...

  2. jdbc_odbc SQLserver 驱动安装及测试

    有2次被问到同一个问题,尽管博客园是.net的园子,我还是分享下吧.PS:我现在做的.net,以前学过点java.献丑了. ------------------ 原始邮件 -------------- ...

  3. Android Marquee

    android:singleLine="true" android:marqueeRepeatLimit="marquee_forever" android:e ...

  4. web.xml配置文件中<async-supported>true</async-supported>报错的解决方案

    为什么用到这个: ssh集成了cxf,当登录系统后,发现系统报错,控制台不断输出下面信息: 2016-05-05 11:05:06 - [http-bio-8080-exec-4] - WARN - ...

  5. 使用<span>标签为文字设置单独样式

    这一小节讲解<span>标签,我们对<em>.<strong>.<span>这三个标签进行一下总结: 1. <em>和<strong& ...

  6. [转]python对json的相关操作

    json官方说明参见:http://json.org/ Python操作json的标准api库参考:http://docs.python.org/library/json.html 对简单数据类型的e ...

  7. js中callee与caller的区别

    callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数首先我们来写个阶成函数:function chen(x){if (x<=1) {return 1;} else ...

  8. Ajax.BeginForm 防止跳转到新页面

    @using (Ajax.BeginForm("ChangeCompanyId", "navigation", new { area = "confi ...

  9. Yii2的相关学习记录,后台模板和gii(三)

    前面已经可以正常登录,但我们需要体验下最常用的增删查改的操作.这里就需要gii,通过gii可以方便的生成表单.表格的框架,不需要我们再写重复的东西. gii访问地址:http://localhost/ ...

  10. jquery 插件模版

    ;(function ($) { //插件的默认值属性 var defaults = { Weight: '300px', height: '230px', nextId: 'nextBtn', ne ...