Llamar: (void) cancelAllOperations on NSoperationQueue no establece la propiedad isCancelled de NSOperation que está presente dentro de la queue

Me enfrento a un problema relacionado con NSoperationQueue. En mi código en:

-(void) viewDidLoad { //Initialisation of queue and operation. //adding operation to queue [self.operationQueue addOperation:op]; } -(void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.operationQueue cancelAllOperations]; } 

Por lo tanto, durante la ejecución de la function principal de NSOperation, cuando controlo la propiedad Cancelada, siempre devuelve NO. De hecho después de llamar cancellAllOperation en NSOperationQueue. p.ej.

 -(void)main { if(self.isCancelled) { // Never executing this block :-( } } 

Para get más detalles, estoy haciendo algunas llamadas de networking en mi NSOperation. Y cuando cambié a otra vista, se invoca cancelAllOperation. Y cuando la respuesta de la networking volvió a funcionar en mi NSOperation, estoy comprobando si (Self.isCancelled) y ahora estoy en otra vista (los medios areCancelled deberían establecer YES). pero esta comprobación siempre falla.

Su operación se agrega a la queue justo después de cargar la vista en viewDidLoad , y la queue asumirá la responsabilidad de comenzar la operación.

Dado que cancela su (s) operación (es) cuando desaparece la vista ( viewWillDisappear ), es probable que la operación finalice en este momento. En otras palabras, su operación se cancela después de ser terminada. Puede verificar la propiedad isExecuting para saber si la operación está funcionando activamente.

Es posible que su operación ya no se ejecute, por lo que no se cancelará. (Una vez que su operación haya finalizado, la queue de operaciones dejará de rastrearlo, por lo que llamar a cancelAllOperations no hará nada).

Si la respuesta de networking que está esperando es llamar a una callback en lugar de bloquear la llamada a main , su operación ya habrá finalizado (cuando regrese principal). Puede solucionar esto utilizando una operación "concurrente" (consulte los documentos de NSOperation; puede indicar cuándo ha terminado, en lugar de hacerlo automáticamente cuando la principal se devuelve) o mediante el uso de llamadas de networking síncronas (por lo tanto, el principal no vuelve hasta realmente estás hecho)