2013-04-07 12 views

risposta

13

La bandiera stop viene usato in questo modo:

[coll enumerateUsingBlock:^(id o, NSUInteger i, BOOL *stop) { 
     if (... check for stop ...) { 
      *stop = YES; 
      return; 
     } 
}]; 

quando il blocco di enumerazione rendimenti, i controlli di raccolta *stop. Se è YES, smette di enumerare.

È implementato in questo modo, al contrario di un valore di ritorno, poiché consente l'enumerazione simultanea senza controllare il valore di ritorno del blocco (che comporterebbe un sovraccarico). Cioè nell'enumerazione concomitante, la raccolta può dispatch_async() qualsiasi numero di iterazioni simultanee e controllare periodicamente *stop. Ogni volta che le transizioni da *stop a YES, interrompe la pianificazione di più blocchi (questo è anche il motivo per cui il flag stop non è un ostacolo: alcuni numeri non specificati di iterazioni possono ancora essere in volo).

Nel vostro iteratore, si potrebbe fare:

BOOL stop = NO; 
for(...) { 
    enumerationBlock(someObj, someIndex, &stop); 
    if (stop) break; 
} 
+0

Grazie, questo funziona perfettamente. La soluzione a questa domanda può anche essere trovata qui: http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C –

6

Il codice seguente definisce un metodo che prende un blocco come parametro e mantiene l'esecuzione fino a quando shouldStop è impostato su NO dal blocco.

- (void)myMethod:(void(^)(BOOL *stop))aBlock { 
    BOOL shouldStop = NO; 
    while (!shouldStop) { 
     aBlock(&shouldStop); 
    } 
} 

La spiegazione è abbastanza semplice. Un blocco è una funzione che prende alcuni parametri. In questo caso passiamo come parametro un puntatore a una variabile BOOL di nostra proprietà. In questo modo stiamo permettendo al blocco di impostare quella variabile e - in questo caso - indicare che il ciclo dovrebbe fermarsi.

A questo punto, il blocco passato poteva fare qualcosa di simile

[self myMethod:^(BOOL *stop) { 
     if (arc4random_uniform(1)) { 
      *stop = YES; 
     } 
}]; 
Problemi correlati