2012-05-24 9 views
14

Sto sviluppando un'applicazione utilizzando API parse.com (backend ospitato che fornisce API per salvare i dati sui loro server). Voglio essere in grado di utilizzare l'app senza interruzioni online e offline. Per questo ho bisogno di usare una coda dove posso posizionare i blocchi che richiedono l'accesso alla rete. Quando la rete diventa disponibile, i blocchi dovrebbero essere eseguiti in serie e quando la rete non è in linea, l'elaborazione della coda dovrebbe essere sospesa.ios: blocchi di coda in background ed eseguiti quando la rete diventa disponibile

Stavo pensando di utilizzare GCD con sospendere/riprendere mentre la rete diventa disponibile/non disponibile. Mi stavo chiedendo se ci sono delle opzioni migliori? Funzionerà se l'app viene messa in background? Caso in questione qui è che un utente salva alcuni dati quando la rete non è disponibile (che viene accodata) e quindi mette l'app in background. Ora quando la rete diventa disponibile, è possibile fare il salvataggio in background in modo automatico?

risposta

15

Faccio esattamente quello che si sta puntando all'utilizzo di uno NSOperationQueue. In primo luogo, creare una coda di serie e sospenderlo per impostazione predefinita:

self.operationQueue = [[[NSOperationQueue alloc] init] autorelease]; 
self.operationQueue.maxConcurrentOperationCount = 1; 
[self.operationQueue setSuspended:YES]; 

Poi, creare un'istanza di raggiungibilità e registrarsi per il kReachabilityChangedNotification:

[[NSNotificationCenter defaultCenter] addObserver:manager 
             selector:@selector(handleNetworkChange:) 
              name:kReachabilityChangedNotification 
              object:nil]; 

[self setReachability:[Reachability reachabilityWithHostName:@"your.host.com"]]; 
[self.reachability startNotifier]; 

Ora, avviare e spegnere il coda quando cambia lo stato della rete :

-(void)handleNetworkChange:(NSNotification *)sender { 
    NetworkStatus remoteHostStatus = [self.reachability currentReachabilityStatus]; 

    if (remoteHostStatus == NotReachable) { 
     [self.operationQueue setSuspended:YES]; 
    } 
    else { 
     [self.operationQueue setSuspended:NO]; 
    } 
} 

È possibile mettere in coda i blocchi con:

[self.operationQueue addOperationWithBlock:^{ 
    // do something requiring network access 
}]; 

Sospendere una coda impedirà solo l'avvio delle operazioni - non sospenderà un'operazione in corso. C'è sempre la possibilità che tu possa perdere la rete mentre un'operazione è in esecuzione, quindi dovresti tener conto di ciò nella tua operazione.

+0

Sto provando un approccio come questo, ma ho problemi con i blocchi "out-of-scope dealloc'd" quando la connettività restituisce .. Hai avuto problemi a invocare i blocchi un po 'più tardi? Sembra: "Impossibile ripristinare il frame corrente" –

1

Hai guardato usando la libreria AFNetworking? Credo che abbia dei ganci in Reachabiltiy e possa comportarsi esattamente come vuoi tu.

+0

Grazie. Avevo visto la libreria di AFNetworking ma sembra essere più per le richieste NSURL e non per tutti i blocchi arbitrari che voglio iniziare ad eseguire solo quando internet è disponibile (che potrebbe usare la connessione netta solo per una parte dell'esecuzione di un blocco). – Devang

+0

Capisco cosa intendi ... la risposta di Raggiungibilità sarebbe stata il mio prossimo pensiero, perché vedo che qualcuno ha già sviluppato questa idea. –

0

Sono un grande fan di GCD e Blocks ma per questo vorrei creare una soluzione utilizzando NSOperationQueue. GCD è a mio parere più per le cose di basso livello. Con NSOperationQueue hai la possibilità di annullare determinate operazioni. Inoltre puoi esprimere dipendenze ad altre operazioni (se questo è necessario nella tua applicazione).

2

Check out -[PFObject saveEventually]. Questo dovrebbe fare ciò che stai cercando di fare automaticamente e ha l'ulteriore vantaggio di essere resiliente contro la terminazione delle app.

Problemi correlati