2012-01-06 11 views
5

He escrito una aplicación basada en pestañas en Xcode/RestKit y estoy intentando utilizar RKReachabilityObserver para determinar la conectividad a Internet en el dispositivo.La mejor manera de implementar RKReachabilityObserver en RestKit

Idealmente me gustaría tener una sola variable de accesibilidad en toda mi aplicación (si esto es posible) pero actualmente mi implementación es según el siguiente código y no funciona muy bien cuando se replica en mis 4 pestañas.

Si alguien tiene alguna sugerencia de una mejor manera de hacerlo, agradecería mucho sus comentarios.

View.hy

@property (nonatomic, retain) RKReachabilityObserver *observer; 

View.m

@interface AppViewController() 
{ 
    RKReachabilityObserver *_observer; 
} 
@property (nonatomic) BOOL networkIsAvailable; 
@synthesize observer = _observer; 

-(id)initWithCoder:(NSCoder *)aDecoder { 

    if ((self = [super initWithCoder:aDecoder])) { 

     self.observer = [[RKReachabilityObserver alloc] initWithHost:@"mydomain"]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(reachabilityChanged:) 
                name:RKReachabilityDidChangeNotification 
                object:_observer]; 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // determine network availability 
    if (! [_observer isReachabilityDetermined]) { 
     _networkIsAvailable = YES; 
    } 
    else 
    { 
     _networkIsAvailable = NO; 
    } 

    _text.returnKeyType = UIReturnKeyDone; 
    _text.delegate = self; 
} 

- (void)reachabilityChanged:(NSNotification *)notification { 
    RKReachabilityObserver* observer = (RKReachabilityObserver *) [notification object]; 
    if ([observer isNetworkReachable]) { 
     if ([observer isConnectionRequired]) { 
      _networkIsAvailable = YES; 
      NSLog(@"Reachable"); 
      return; 
     } 
    } 
    else 
    { 
     _networkIsAvailable = NO; 
     NSLog(@"Not reachable"); 
    } 
} 

continuación, en cualquier lugar, en mi opinión, yo simplemente hago ....

if (_networkIsAvailable == YES) 
    {... 

tengo implementado esto en múltiples vistas (lo que parece estar causando el problema

¿Cuál es el enfoque sugerido para una aplicación de vista múltiple?

Respuesta

18

El singleton [RKClient sharedClient] ya tiene una propiedad para eso (reachabilityObserver). Siéntase libre de usar ese.

if ([[[RKClient sharedClient] reachabilityObserver] isReachabilityDetermined] && [[RKClient sharedClient] isNetworkReachable]) { 
    .... 
} 

También puede suscribirse para recibir notificaciones RKReachabilityObserver (si usted quiere tomar ninguna acción cuando el estado de accesibilidad de cambios)

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(reachabilityStatusChanged:) 
               name:RKReachabilityDidChangeNotification object:nil]; 
+0

En su lugar, utilicé el singleton y funciona perfectamente. Gracias. – Nick

+0

Hola mja. ¿Hay alguna forma de tocar un host seleccionado con singleton sharedClient? Además, el tiempo de carga inicial es de alrededor de 2 segundos. ¿Esto es normal? – Nick

+0

Hubo algunos problemas en iOS5 con respecto a la API de accesibilidad. Lo mejor es que defina su URL base como dirección IP (si es posible), luego RestKit usará la IP para determinar el estado: los problemas estaban relacionados con la forma en que iOS maneja las solicitudes de DNS al determinar el estado de accesibilidad. Sí, puede haber un poco de retraso. ¿Estás probando en el dispositivo o Simulador? Si el dispositivo, qué iOS tiene (y también conectividad - Edge/3G/WiFi) – mja

2

Aquí es algunos cambios en RestKit 0.20 y posteriores. El código del bloque de accesibilidad debe ser similar a:

RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[RemoteTools serverUrl]]; 
[manager.HTTPClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
    if (status == AFNetworkReachabilityStatusNotReachable) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No network connection" 
                 message:@"You must be connected to the internet to use this app." 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
     [alert show]; 
    } 
}]; 
+0

¿hay alguna manera de implementar esto una vez y hacer lo mismo para todas las pantallas? – jonypz

+0

Simplemente impleméntelo para el administrador una vez y luego úselo como [RKObjectManager sharedManager]. Entonces, las alyaws usan el mismo administrador con el bloque de accesibilidad implementado. – CTiPKA

Cuestiones relacionadas