AFNetwork监听网络失效

监听网络状态大家都不陌生,尤其是使用AFNetwork监听,

我的思路是对AFNetwork进行二次封装,然后直接以属性的形式输出结果

#pragma mark - 属性
/// 网络状态
@property (nonatomic, assign, readonly) NetworkState state;
@interface NetworkStateTool ()
@property (nonatomic, assign, readwrite) NetworkState state;
@end
#pragma mark -- 开启网络监听
- (void)startNetworkStateMonitoring {
    
    AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
    //开启网络监听
    [mgr startMonitoring];
    
    [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown: // 未知网络
                NSLog(@"未知网络");
                self.state = NetworkStateUnknown;
                break;
                
            case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网)
                NSLog(@"没有网络");
                self.state = NetworkStateNone;
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络
                NSLog(@"手机自带网络");
                self.state = NetworkStateWWAN;
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI
                NSLog(@"WIFI");
                self.state = NetworkStateWiFi;
                break;
        }
    }];
    
}

按照官方的说法,我们只需要调用一次startNetworkStateMonitoring方法,

即只需要调用startMonitoring方法一次,即可在setReachabilityStatusChangeBlock中收到实时结果

实测:

WIFI--->断网 可以实时监测

但是

断网--->WIFI 无法实时监测,即setReachabilityStatusChangeBlock中收不到结果

只有重新调用setReachabilityStatusChangeBlock方法,才可以拿到实时结果

故修改代码如下:直接通过方法获取

+ (NetworkState)networkState {
    NetworkState __block state;
    AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
    [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown: // 未知网络
                NSLog(@"未知网络");
                state = NetworkStateUnknown;
                break;
                
            case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网)
                NSLog(@"没有网络");
                state = NetworkStateNone;
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络
                NSLog(@"手机自带网络");
                state = NetworkStateWWAN;
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI
                NSLog(@"WIFI");
                state = NetworkStateWiFi;
                break;
        }
    }];
    
    //开启网络监听
    [mgr startMonitoring];
    
    return state;
}
原文地址:https://www.cnblogs.com/lijianyi/p/14705812.html