AFNetworking 3.0源码阅读 - AFNetworkReachabilityManager

AFNetworkReachabilityManager是AFNetWorking库中用于监控网络环境变化的类。

首先从AFNetworkReachabilityManager.h文件一层一层往下看。

其实现是依赖于SystemConfiguration这个api。

这是一个用以描述网络状态的枚举封装。在枚举下方以及.h文件的最底端可以看到两个宏NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END,这两个宏是苹果为了减轻开发者工作量专门提供的两个宏,在这两个宏之间的代码中的简单指针对象均被定义为nonnull,也就是对象不可以为null。一般用于OC向转时区分对象到底是什么类型,另外一个是nullable代指对象可以为null或者nil。

Swift 中的 nil 和Objective-C 中的 nil 不同,在 Objective-C 中 nil 是一个指向不存在对象的指针。在 Swift中,nil 不是指针,他是值缺失的一种特殊类型,任何类型的可选项都可以设置成 nil 而不仅仅是对象类型。Swift编程语言

接下来看下.h文件中暴露出的属性。 

定义了四个只读属性:

1.网络状态

2.网络是否可达

3.是否为WWAN

4.是否为WiFi

注意:BOOL属性的getter方法要写。 

提供了5个初始化方法,其中SCNetworkReachabilityRef是该类实现的基础。

打开和关闭监听的方法。 

可以通过该方法返回的字符串来提示用户,也可以自定义提示文字

当网络状态变化时的回调,以block方式实现。 

 

该方法返回一个AFNetworkReachabilityStatus状态的本地化字符串,通过FOUNDATION_EXPORT定义可以进行==比较以及可以在该文件中隐藏实现细节

接着开始看AFNetworkReachabilityManager.m。

 引入的系统库头文件。

一些定义和初始化。

根据传入的网络状态返回响应的开发中的本地化字符串。

该方法是先通过flags调用上一张图片中的方法获取本地化的字符串之后使用通知或者block传递出去。放在同一个方法是为了保证block和通知传出数据一致,使用异步串行队列是为了保证监听顺序正确。比如说当前为蜂窝然后我将蜂窝的状态作为通知的info发送出去,此时改成wifi那么就会有一次发送一个wifi状态info的通知,且薄两次接收的顺序依次为先蜂窝再wifi。

回调时调用发送状态改变的那个方法。

这两个方法其实是作为之后SCNetworkReachabilityContext结构体的参数。

类中的属性

注意单例写法

调用顺序sharedManager ==> manager ==> managerForAddress:(const void *)address

此处有一个CFRetain操作

销毁时停止监听同时CFrelease操作 

核心方法,设置网络监听。SCNetWorkReachability相关使用参考官方demo https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

步骤:创建conetext,设置回调,加入runloop。 

此处有个键值依赖。

 

posted @ 2018-05-08 16:05  清水00  阅读(152)  评论(0编辑  收藏  举报