2012-09-30 21 views
15

xCode 4.4.1 OS X 10.8.2, wygląda jak [operacja cancelAllOperations]; nie działa[NSOperation cancelAllOperations]; nie przerywa operacji.

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

wyników 9999999

Odpowiedz

26

Wewnątrz bloku, szczególnie wewnątrz pętli, zadzwoń -isCancelled sprawie funkcjonowania. Jeśli to prawda, wróć.

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

Kolejka nie można po prostu przestać wykonanie wykonywanej operacji dowolnie - co jeśli niektóre współdzielone zasoby były wykorzystywane przez działania, które nigdy nie były czyszczone w górę? Twoim obowiązkiem jest zakończyć operację, gdy zostaniesz powiadomiony o anulowaniu. Od Apple's docs:

Celem operacji jest odpowiedzialny za wywołanie isCancelled okresowo i zatrzymując się, czy metoda zwraca TAK.

+0

, więc nie można zatrzymać działania, aż do końca? – Awesome

+0

Jest - w kodzie sprawdzasz isCancelled. Jeśli to prawda, przestajesz wykonywać. Operacja zatrzymuje się, kolejka po prostu mówi, aby anulować. Czy to ma sens? –

+0

Dziękuję :) Nie rozumiem. – Awesome

Powiązane problemy