2012-05-24 21 views
14

Estoy desarrollando una aplicación que utiliza API parse.com (back-end alojado que proporciona API para guardar datos en sus servidores). Quiero poder usar la aplicación sin problemas en línea y fuera de línea. Para esto necesitaría usar una cola donde pueda colocar bloques que requieren acceso a la red. Cuando la red está disponible, los bloques deben ejecutarse en serie y cuando la red se desconecta, el proceso de cola debe suspenderse.ios: bloquea los bloques en segundo plano y se ejecuta cuando la red está disponible

Estaba pensando en usar GCD con suspender/reanudar cuando la red esté disponible/no disponible. Me preguntaba si hay mejores opciones? ¿Esto funcionará si la aplicación se pone en segundo plano? El ejemplo aquí es que un usuario guarda algunos datos cuando la red no está disponible (que se pone en cola) y luego coloca la aplicación en segundo plano. Ahora, cuando la red esté disponible, ¿es posible hacer el ahorro en segundo plano automágicamente?

Respuesta

15

Hago exactamente lo que pretende con un NSOperationQueue. En primer lugar, crear una cola de serie y suspenderlo de forma predeterminada:

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

A continuación, cree una instancia de accesibilidad y registrarse para el kReachabilityChangedNotification:

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

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

Ahora, iniciar y detener la cola cuando cambia el estado de la red :

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

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

puede poner en cola con sus bloques:

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

Suspender una cola evitará que las operaciones se inicien, no suspenderá una operación en curso. Siempre existe la posibilidad de que pueda perder la red mientras se está ejecutando una operación, por lo que debe contabilizar eso en su operación.

+0

Estoy probando un enfoque como este, pero estoy teniendo problemas con bloques "fuera de alcance negociados" cuando la conectividad vuelve ... ¿Tuvo algún problema invocando sus bloques un poco más tarde? Parece que: "no se pudo restaurar el fotograma actual" –

1

¿Ha mirado utilizando la biblioteca AFNetworking? Creo que tiene ganchos en Reachabiltiy y puede comportarse exactamente como lo desee.

+0

Gracias. Había mirado la libración de AFNetworking, pero parece ser más para solicitudes NSURL y no para bloques arbitrarios que deseo comenzar a ejecutar solo cuando internet esté disponible (que podría usar la conexión de red solo para alguna parte de la ejecución del bloque). – Devang

+0

Veo lo que quiere decir ... la respuesta de Accesibilidad hubiera sido mi siguiente pensamiento, pero veo que alguien ya desarrolló esa idea. –

0

Soy un gran admirador de GCD y Blocks, pero para esto construiría una solución usando NSOperationQueue. GCD es en mi opinión más por las cosas de bajo nivel. Con NSOperationQueue tiene la capacidad de cancelar ciertas operaciones. También puede expresar dependencias a otras operaciones (si esto es necesario en su aplicación).

2

Consulte -[PFObject saveEventually]. Esto debería hacer lo que intenta hacer automáticamente y tiene el beneficio adicional de ser resistente contra la finalización de la aplicación.

Cuestiones relacionadas