AFNetworkReachabilityManager说没有网络

时间:2014-04-16 17:27:26

标签: ios7 afnetworking-2

由于缺少示例,我感到困惑,所以我在appDelegate的didFinishLaunching中做到了这一点:

[[AFNetworkReachabilityManager sharedManager] startMonitoring];
bool isThere = [[AFNetworkReachabilityManager sharedManager] isReachable];

尽管网络在那里工作,但总是会返回false。

两个问题:

1)如果我没有寻找状态变化,我是否需要startMonitoring?

2)在阅读isReachable之前你需要做些什么吗?你需要等吗?

3 个答案:

答案 0 :(得分:16)

我知道现在回答为时已晚。如果有人在寻找这个。

确定网络状态只需要很少的时间。 因此,在startMonitoring之后立即调用 isReachable 将始终返回 false

您可以在 setReachabilityStatusChangeBlock 中调用 isReachable ;

    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
          NSLog(@"status changed");
         //check for isReachable here
    }];

答案 1 :(得分:3)

嘿,我发布答案的时间已经很晚了,但是当我看到这个问题时,我记得我花了多长时间才得到一个有效的代码来检查网络是否可用并最终找到了这段代码。连接变量是Bool,它将在访问时提供瞬时网络状态,在类中使用此代码块将为您提供实时网络状态。它希望有人会发现它很有用。 谢谢

func checkNetworkStatus(completion:@escaping (_ connected:Bool) ->())
{
    let reachability = AFNetworkReachabilityManager.shared()
    reachability.startMonitoring();
    reachability.setReachabilityStatusChange({ (status) -> Void in

        switch(status) {

        case .unknown:
            self.connectivity = false
            completion(false)

        case .notReachable:
            self.connectivity = false
            completion(false)

        case .reachableViaWWAN:
            self.connectivity = true
            completion(true)

        case .reachableViaWiFi:
            self.connectivity = true
            completion(true)
        }
    })
}

此代码块可以在您的班级中用作

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.initNetworkMonitoring { (status) in
        // make necessary UI updates
    }

答案 2 :(得分:0)

isReachable由Apple API SCNetworkReachabilityGetFlags 完成。这是一个块调用,因此AFN在后台队列中调用它:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{
    SCNetworkReachabilityFlags flags;
    if (SCNetworkReachabilityGetFlags(self.networkReachability, &flags)) {
        AFPostReachabilityStatusChange(flags, callback);
    }
});

如果您尝试https://github.com/tonymillion/Reachability,则会立即获得结果。但当然可能会导致像main thread blocked on SCNetworkReachabilityGetFlags

这样的问题
-(BOOL)isReachable
{
    SCNetworkReachabilityFlags flags;  

    if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
        return NO;

    return [self isReachableWithFlags:flags];
}