2012-04-11 8 views
6

Utilizo la clase de Accesibilidad para saber si tengo una conexión a Internet disponible. El problema es que cuando el wifi está disponible pero no en Internet, el método - (NetworkStatus) currentReachabilityStatus toma demasiado tiempo.Cómo definir un tiempo de espera alcanzable en ios

mi código:

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

La aplicación "congelar" temporalmente en la segunda línea. ¿Cómo definir el tiempo máximo para esta espera?

+0

wifi disponible pero no en internet? ¿Qué significa? –

+5

significa que la conexión wifi entre el enrutador y el iPad está bien, pero no hay conexión a Internet disponible. – Anthony

+0

bien ... lo tengo. :) –

Respuesta

3

No lo creo. Pero, lo que es más importante, no creo que te gustaría si pudieras (puedes obtener falsos positivos). Deje que Alcance se ejecute, es el curso.

Si mira el proyecto de demostración Reachability, la idea es no invocar reachabilityWithHostName y marcar currentReachabilityStatus cuando necesite Internet. Invoca currentReachabilityStatus en el archivo didFinishLaunchingWithOptions de su aplicación, configura una notificación y Reachability le indicará cuando la conectividad a Internet haya cambiado. Considero que las comprobaciones posteriores a currentReachabilityStatus son bastante rápidas (independientemente de la conectividad) cuando yo (a) configuro la accesibilidad al inicio; pero (b) verificar la conectividad de manera just-in-time.

Y si necesita absolutamente comenzar su procesamiento inmediatamente, entonces la pregunta es si puede empujar eso en segundo plano (por ejemplo, dispatch_async()). Por ejemplo, mi aplicación recupera las actualizaciones del servidor, pero como eso sucede en segundo plano, ni yo ni mi usuario somos conscientes de que haya retrasos.

0

Estaba teniendo problemas con la misma cosa, pero encontré una manera de especificar un tiempo de espera. Reemplacé este método dentro de la Clase de Accesibilidad de 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; 
}