2012-01-06 11 views
5

Ho scritto un'applicazione basata su schede in Xcode/RestKit e sto tentando di utilizzare RKReachabilityObserver per determinare la connettività Internet sul dispositivo.Il modo migliore per implementare RKReachabilityObserver in RestKit

Idealmente mi piacerebbe avere un'unica variabile di raggiungibilità nella mia applicazione (se possibile), ma attualmente la mia implementazione è conforme al seguente codice e non funziona molto bene se replicata sulle mie 4 schede.

Se qualcuno ha qualche suggerimento su un modo migliore per farlo, sarei davvero grato ai vostri commenti.

View.he

@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"); 
    } 
} 

poi ovunque a mio avviso, faccio semplicemente ....

if (_networkIsAvailable == YES) 
    {... 

ho implementato su più punti di vista (che sembra essere causa del problema

Qual è l'approccio suggerito per un'applicazione a visualizzazione multipla?

risposta

18

Il singleton [RKClient sharedClient] ha già una proprietà per tale (raggiungibilitàObserver). Sentiti libero di usarlo.

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

È inoltre possibile iscriversi alla notifica RKReachabilityObserver (se si vuole intraprendere alcuna azione quando lo stato di raggiungibilità modifiche)

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

Ho usato il singleton invece e funziona perfettamente. Grazie. – Nick

+0

Ciao mja. C'è un modo per toccare un host selezionato con il singleton SharedClient? Inoltre, il tempo per il primo carico è di circa 2 secondi. È normale? – Nick

+0

Ci sono stati alcuni problemi su iOS5 relativi all'API di raggiungibilità. È preferibile che tu definisca il tuo baseURL come indirizzo IP (se possibile), quindi RestKit utilizzerà l'IP per determinare lo stato: i problemi erano legati al modo in cui iOS gestisce le richieste DNS quando determina lo stato di raggiungibilità. Sì, ci può essere un po 'di ritardo. Stai provando sul dispositivo o sul simulatore? Se dispositivo, cosa iOS hai (e anche connettività - Edge/3G/WiFi) – mja

2

Ecco alcuni cambiamenti nella RestKit 0.20 e versioni successive. Il codice del blocco di raggiungibilità dovrebbe essere:

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

c'è un modo per implementarlo una volta e fare la stessa cosa per tutti gli schermi? – jonypz

+0

Basta implementarlo per manager una volta e quindi utilizzarlo come [RKObjectManager sharedManager]. Quindi, alyaws usa lo stesso manager con il blocco di raggiungibilità implementato. – CTiPKA

Problemi correlati