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