【问题标题】:AFNetworking 2.0. How check reachability status for socket (managerForAddress:)?AFNetworking 2.0。如何检查套接字的可达性状态(managerForAddress :)?
【发布时间】:2013-10-13 12:43:09
【问题描述】:

我使用“pod install”安装 AFNetworking 2.0,并使用 App.xcworkspace。 使用 AFNetworking 2.0,我成功发送了 POST 请求,但在可达性方面我遇到了问题。 我需要监视套接字何时打开和关闭,我的代码不起作用,我忘记了什么?

// Check server socket available
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_len = sizeof(serverAddr);
serverAddr.sin_port = htons(80);
serverAddr.sin_addr.s_addr = inet_addr("192.168.1.108");

AFNetworkReachabilityManager *reachability = [AFNetworkReachabilityManager managerForAddress:&serverAddr];
[reachability setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status) {
        case AFNetworkReachabilityStatusNotReachable:
            NSLog(@"No Internet Connection");
            break;
        case AFNetworkReachabilityStatusReachableViaWiFi:
            NSLog(@"WIFI");
            break;
        case AFNetworkReachabilityStatusReachableViaWWAN:
            NSLog(@"3G");
            break;
        default:
            NSLog(@"Unknown network status");
            break;
    }
}];
[reachability startMonitoring];

【问题讨论】:

    标签: afnetworking reachability


    【解决方案1】:

    我想我找到了问题所在。看起来 AFNetworking 的回调机制无法正常工作 - 查看 AFNetworkReachabilityManager 的 startMonitoring 方法:有一个:

            if (strongSelf.networkReachabilityStatusBlock) {...
    

    无论你是否设置了回调,这似乎都失败了。

    为了解决这个问题,我向 AFNetworkReachabilityManager 添加了以下方法:

    - (void)startMonitoringWithStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block
    {
        [self stopMonitoring];
    
        if (!self.networkReachability) {
            return;
        }
    
        __weak __typeof(self)weakSelf = self;
        AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {
            __strong __typeof(weakSelf)strongSelf = weakSelf;
    
            strongSelf.networkReachabilityStatus = status;
            if (block) {
                block(status);
            }
        };
    
        SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL};
        SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context);
    
        SCNetworkReachabilityFlags flags;
        SCNetworkReachabilityGetFlags(self.networkReachability, &flags);
        dispatch_async(dispatch_get_main_queue(), ^{
            AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags);
            callback(status);
        });
    
        SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
    }
    

    这基本上做同样的事情,但从方法参数而不是从可达性管理器的属性引用块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多