2012-04-11 10 views
6

Uso la classe Reachability per sapere se è disponibile una connessione Internet. Il problema è quando il wifi è disponibile ma non internet, il metodo - (NetworkStatus) currentReachabilityStatus impiega troppo tempo.Come definire un timeout di raggiungibilità su ios

il mio codice:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"]; 
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

L'applicazione "congelare" temporaneamente sulla seconda riga. Come definire il tempo massimo per questa attesa?

+0

wifi è disponibile ma non internet? Cosa significa?? –

+5

significa che la connessione wifi tra il router e l'iPad è ok, ma non è disponibile alcuna connessione Internet. – Anthony

+0

ok .. capito. :) –

risposta

3

Non credo. Ma ancora più importante, non penso che vorresti se potessi (potresti ottenere falsi positivi). Lascia che sia Raggiungibile corso.

Se si guarda al progetto di dimostrazione Reachability, la nozione non è di invocare reachabilityWithHostName e controllare currentReachabilityStatus quando è necessario Internet. Si invoca currentReachabilityStatus durante la funzione didFinishLaunchingWithOptions del delegato dell'app, si imposta una notifica e Reachability indica a di quando la connettività Internet è cambiata. Trovo che i controlli successivi a currentReachabilityStatus siano molto veloci (indipendentemente dalla connettività) quando I (a) raggiungibilità di installazione all'avvio; ma (b) verificare la connettività in modo just-in-time.

E se è assolutamente necessario avviare immediatamente l'elaborazione, la domanda è se è possibile inviarlo in background (ad esempio dispatch_async()). Ad esempio, la mia app recupera gli aggiornamenti dal server, ma poiché ciò accade in background, né io né il mio utente sono a conoscenza di eventuali ritardi.

0

Avevo problemi con la stessa cosa ma ho trovato un modo per specificare un timeout. Ho sostituito questo metodo all'interno della classe Reachability di Apple.

- (NetworkStatus)currentReachabilityStatus 
{ 
NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL  SCNetworkReachabilityRef"); 
//NetworkStatus returnValue = NotReachable; 
__block SCNetworkReachabilityFlags flags; 

__block BOOL timeOut = NO; 
double delayInSeconds = 5.0; 

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){ 

    timeOut = YES; 

}); 

__block NetworkStatus returnValue = NotReachable; 

__block BOOL returned = NO; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) 
    { 
     if (_alwaysReturnLocalWiFiStatus) 
     { 
      returnValue = [self localWiFiStatusForFlags:flags]; 
     } 
     else 
     { 
      returnValue = [self networkStatusForFlags:flags]; 
     } 
    } 
    returned = YES; 

}); 

while (!returned && !timeOut) { 
    if (!timeOut && !returned){ 
     [NSThread sleepForTimeInterval:.02]; 
    } else { 
     break; 
    } 
} 

return returnValue; 
} 
Problemi correlati