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。
此处有个键值依赖。