对AFN的Reachability的学习

                                学习afn的源码
AFNetworkReachabilityStatus   当前网络的状态4中
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    AFNetworkReachabilityStatusUnknown          = -1,
    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;


扫描二维码关注公众号,回复: 1165933 查看本文章

开始检测网络的可达性

- (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的键值监听方法。这就是键值依赖的作用。



猜你喜欢

转载自blog.csdn.net/super_man_ww/article/details/79446413
今日推荐