2014-04-16 6 views
5

sono confuso a causa della mancanza di esempi, così ho fatto questo nella mia didFinishLaunching di AppDelegate:AFNetworkReachabilityManager dice no rete

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

E che restituisce sempre false, nonostante la rete di essere lì e di lavoro.

due domande:

1) se io non sto cercando cambiamenti dello stato, ho bisogno di startMonitoring?

2) c'è qualcosa che devi fare prima di leggere è raggiungibile? Hai bisogno di aspettare?

risposta

14

So che è troppo tardi per rispondere. Se qualcuno cerca questo.

Determinare lo stato della rete richiede poco tempo. Quindi, chiamando è raggiungibile subito dopo startMonitoring restituirà sempre false false.

È possibile chiamare isReachable all'interno setReachabilityStatusChangeBlock;

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

Soluzione eccellente, non troppo tardi! –

0

isReachable è fatto da Apple API SCNetworkReachabilityGetFlags. Questa è una chiamata di blocco, in modo da AFN chiamano in una coda di fondo:

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

Se si tenta https://github.com/tonymillion/Reachability si ottiene immediatamente il risultato poi. Ma naturalmente potrebbe causare il problema, main thread blocked on SCNetworkReachabilityGetFlags

-(BOOL)isReachable 
{ 
    SCNetworkReachabilityFlags flags; 

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

    return [self isReachableWithFlags:flags]; 
}