Cancelar la tarea asincrónica de GCD al navegar hacia atrás

Tengo una tarea relativamente larga (5-10 segundos) en un controller de vista en mi aplicación iOS. Está ejecutando asíncrono en segundo plano por GCD. El usuario tiene la capacidad de realizar operaciones de interfaz de usuario durante esta tarea, por lo que también tiene la capacidad de presionar el button Atrás para navegar a la vista anterior.

Mi código es bastante sencillo:

dispatch_queue_t queue = dispatch_queue_create("com.xyz", NULL); dispatch_async(queue, ^{ TestObject* test = [self getTestObject]; dispatch_async(dispatch_get_main_queue(), ^{ test.resultset.count > 0 ? [self performSegueWithIdentifier:@"xy" sender:self] : [UIUtils showSimpleAlert:NSLocalizedString(@"NoDataForInterval",nil) delegate:self]; }); }); 

Información de exception: aplicación de NSGenericException debido a una exception no NSGenericException , motivo:

No se pudo encontrar un controller de navigation para segue 'xy'. Push segues solo se puede usar cuando el controller de origen es administrado por una instancia de UINavigationController.

Entonces, el problema es que, cuando mi usuario regresa a la vista anterior, la tarea en GCD continúa, y al terminar, bloquea mi aplicación porque no puede realizar mi segue.

Entonces, mi pregunta: ¿cómo puedo cancelar mi tarea asny en GCD cuando navego a otra vista? O simplemente testing de alguna manera la vista actual al completar, como

 if(!self.navigationController) return; 

O…?

¡Gracias por todo!

 if(!self.navigationController) return; 

¿Entonces intentaste eso? Una vez que regrese al hilo principal, es perfectamente seguro y razonable mirar el estado de la interfaz.

Si, por otro lado, realmente desea que sea más fácil cancelar su larga tarea en el medio, use NSOperation en lugar de los bloques GCD. Esto le brinda una API de cancelación segura para subprocesss.