2012-09-30 8 views
15

xCode 4.4.1 OSX 10.8.2, si presenta come [operazione cancelAllOperations]; non funziona[NSOperazione cancelAllOperations]; non ferma l'operazione

- (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]; 
    } 
} 

risultati 9999999

risposta

26

All'interno del blocco, in particolare all'interno del ciclo, chiamare -isCancelled sul funzionamento. Se è vero, allora ritorna.

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 coda non può semplicemente interrompere l'esecuzione dell'operazione in modo arbitrario - che cosa se alcune risorse condivise venivano utilizzati dalla operazione che non ha mai avuto ripulito? È tua responsabilità terminare ordinatamente l'operazione quando diventa noto per essere annullata. Da Apple's docs:

Un oggetto funzionamento è responsabile della chiamata isCancelled periodicamente e l'arresto se stessa se il metodo restituisce YES.

+0

quindi non c'è modo di interrompere l'operazione fino al completamento? – Awesome

+0

C'è - all'interno del codice, si controlla isCancelled. Se è vero, allora smetti di farlo. L'operazione si interrompe, la coda dice semplicemente di annullare. Ha senso? –

+0

Grazie :) non capisco. – Awesome

Problemi correlati