AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
属性:reachable 是否有网
属性:reachableViaWWAN 是否是移动网络
属性:reachableViaWiFi是否是无线网络
ps: FOUNDATION_EXPORT 和#define 都能定义常量。FOUNDATION_EXPORT 能够使用==进行判断,效率略高。而且能够隐藏定义细节(就是实现部分不在.中)
/**
创建并返回指定域的网络可达性管理器。
@param域用于评估网络可达性的域。
@return初始化的网络可达性管理器,主动监视指定的域。
**/
+ (instancetype)managerForDomain:(NSString *)domain
创建并返回套接字地址的网络可达性管理器。
@参数地址用于评估网络可达性的套接字地址(`sockaddr_in6`)。
@return初始化的网络可达性管理器,主动监视指定的套接字地址。
*/
+ (instancetype)managerForAddress:(const void *)address;
开始检测网络的可达性
- (void)startMonitoring;
先停止检测,然后判断是偶有网。
[self stopMonitoring];
if (!self.networkReachability) {
return;
}
设置网络监控分为下边几个步骤:
1.我们先新建上下文
1 SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL};
2.设置回调
1 SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context);
其中这个AFNetworkReachabilityCallback 是这样被定义的一个函数
typedef void (*SCNetworkReachabilityCallBack) ( SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void * __nullable info );
在本类中
1 static void AFNetworkReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) { 2 AFPostReachabilityStatusChange(flags, (__bridge AFNetworkReachabilityStatusBlock)info); 3 }
3.加入RunLoop池
1 SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
其中CFRunLoopGetMain()代表主RunLoop
ok,差不多已经完成
在异步线程 发送一次当前的网络状态。
停止网络监控
这两个方法没什么好说的了,一个是getter 一个是setter
注册键值依赖,这个可能大家平时用的比较少。可以了解一下
比如说一个类User中有两个属性
还有一个卡片的类card
我们写一个info的setter 和 getter 方法,
1 @interface User :NSObject 2 @property (nonatomic,copy)NSString *name; 3 @property (nonatomic,assign)NSUInteger age; 4 @end 5 6 7 8 @interface card :NSObject 9 @property (nonatomic,copy)NSString *info; 10 @property (nonatomic,strong)User *user; 11 @end 12 @implementation card 13 14 - (NSString *)info { 15 return [NSString stringWithFormat:@"%@/%lu",_user.name,(unsigned long)_user.age]; 16 } 17 - (void)setInfo:(NSString *)info { 18 19 NSArray *array = [info componentsSeparatedByString:@"/"]; 20 _user.name = array[0]; 21 _user.age = [array[1] integerValue]; 22 23 } 24 25 + (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key { 26 NSSet * keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; 27 NSArray * moreKeyPaths = nil; 28 29 if ([key isEqualToString:@"info"]) 30 { 31 moreKeyPaths = [NSArray arrayWithObjects:@"user.name", @"user.age", nil]; 32 } 33 34 if (moreKeyPaths) 35 { 36 keyPaths = [keyPaths setByAddingObjectsFromArray:moreKeyPaths]; 37 } 38 39 return keyPaths; 40 } 41 42 @end
代码差不多就是上边的。我们可以监听card的info属性,当user中的name或者age的值发生改变的时候,就会触发info的键值监听方法。这就是键值依赖的作用。