2012-09-30 9 views
15

xCode 4.4.1 OSX 10.8.2, tiene el aspecto [operación cancelAllOperations]; no está funcionando[NSOperation cancelAllOperations]; no detiene la operación

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSOperationQueue *operation = [[NSOperationQueue alloc] init]; 
    [operation setMaxConcurrentOperationCount: 1]; 
    [operation addOperationWithBlock: ^{ 
     for (unsigned i=0; i < 10000000; i++) { 
      printf("%i\n",i); 
      } 
    }]; 
    sleep(1); 
    if ([operation operationCount] > 0) { 
     [operation cancelAllOperations]; 
    } 
} 

resultados 9999999

Respuesta

26

Dentro de su bloque, sobre todo dentro del bucle, llame -isCancelled en la operación. Si es verdad, entonces regresa.

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
[operationQueue setMaxConcurrentOperationCount: 1]; 

NSBlockOperation *operation = [[NSBlockOperation alloc] init]; 
__weak NSBlockOperation *weakOperation = operation; 
[operation addExecutionBlock:^{ 
    for (unsigned i=0; i < 10000000; i++) { 
     if ([weakOperation isCancelled]) return; 
     printf("%i\n",i); 
    } 
}]; 
[operationQueue addOperation:operation]; 

sleep(1); 

if ([operationQueue operationCount] > 0) { 
    [operationQueue cancelAllOperations]; 
} 

Una cola no sólo puede detener la ejecución de la operación de forma arbitraria - ¿y si algunos recursos compartidos estaban siendo utilizados por la operación que nunca llegó limpiado? Es su responsabilidad finalizar de manera ordenada la operación cuando se sabe que se cancela. De Apple's docs:

Un objeto operación es responsable de llamar isCancelled periódicamente y pararse si el método devuelve SÍ.

+0

así que no hay manera de detener la operación hasta que termine? – Awesome

+0

Hay - dentro del código, verifica que está cancelado. Si es verdad, entonces dejas de ejecutar. La operación se detiene sola, la cola simplemente le dice que cancele. ¿Tiene sentido? –

+0

Gracias :) Lo entiendo no. – Awesome

Cuestiones relacionadas