AFNetworking3源码阅读-Reachability
用于监控网络状态。当网络状态改变时,是重新发起一些请求的好时间;网络状态的监控也能给用户更好的网络失败提示。
AFNetworkReachabilityManager
使用
1 | [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { |
结构
AFNetworkReachabilityManager中大概有这么几个方法:
初始化
sharedManager 使用GCD
dispatch_once_t
单例化。具体实例调用 manager 方法。
+manager方法使用了这个函数来创建一个默认的,用于0.0.0.0的连接器
__IPHONE_OS_VERSION_MIN_REQUIRED
在iOS环境下(要求最低的系统版本);__MAC_OS_X_VERSION_MIN_REQUIRED
则表示mac环境下要求的最低环境
90000 表示 __IPHONE_9_0
;101100 表示 __MAC_10_11
sockaddr_in6 代表ipv6地址
sockaddr_in 代表ipv4d地址
由于IPv6 是ios9和os_x 10.11后边推出的,这里要进行版本判断。
1 | + (instancetype)manager |
通过
SCNetworkReachabilityCreateWithAddress
生成SCNetworkReachabilityRef对象,通过监控该对象,即可获得网络连接情况。
1 | + (instancetype)managerForAddress:(const void *)address { |
监听
开启监听后,获得连接状态会调用
AFPostReachabilityStatusChange
,在AFPostReachabilityStatusChange中调用回调,并发送通知
1 | - (void)startMonitoring { |
关闭监听
1 | - (void)stopMonitoring { |
注册键值监听
重装keyPathsForValuesAffectingValueForKey,指明reachable 、reachableViaWWAN 和reachableViaWiFi属性依赖于networkReachabilityStatus。当networkReachabilityStatus改变时,观察reachable 、reachableViaWWAN 和reachableViaWiFi属性的程序需要被通知。
这是因为获得网络状态时,回调中只修改了networkReachabilityStatus值。
1 | + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { |
SCNetworkReachability
从上文可以看出监听主要使用的是SystemConfiguration框架中 SCNetworkReachability.h中的方法。这里介绍一下用到的方法和数据类型。
SCNetworkReachabilityFlags: 保存连接状态各个状态的含义如下:
1 | typedef CF_OPTIONS(uint32_t, SCNetworkReachabilityFlags) { |
SCNetworkReachabilityRef 用来测试连接的引用。有三种创建方式:
1 | SCNetworkReachabilityCreateWithAddress(allocator,address) |
SCNetworkReachabilityContext 上下文是一个结构体:
1 | typedef struct { |
SCNetworkReachabilitySetCallback 给客户端指定对应target(该参数和需要检测网络状况的地址有一定关联,此处使用的是self.networkReachability),然后当这个target的网络状态变化时,告之SCNetworkReachabilityCallBack对象callBack处理(此处使用的是AFNetworkReachabilityCallback),另外callBack中使用到的参数包括target和context提供的info。
1 | Boolean |