Die stop
Flag wird wie folgt verwendet:
[coll enumerateUsingBlock:^(id o, NSUInteger i, BOOL *stop) {
if (... check for stop ...) {
*stop = YES;
return;
}
}];
Wenn die Aufzählung Block zurückgibt, die Sammlung überprüft *stop
. Wenn es YES
ist, hört es auf zu zählen.
Es wird auf diese Weise implementiert, im Gegensatz zu einem Rückgabewert, da dies eine gleichzeitige Aufzählung ermöglicht, ohne den Rückgabewert des Blocks zu überprüfen (was einen Overhead verursachen würde). I.e. Bei gleichzeitiger Aufzählung kann die Sammlung dispatch_async()
beliebig viele gleichzeitige Iterationen und regelmäßig überprüfen *stop
. Immer wenn *stop
zu YES
übergeht, hört es auf, weitere Blöcke zu planen (das ist auch der Grund, warum das Flag stop
kein Hardstop ist; einige nicht spezifizierte Anzahl von Iterationen befindet sich möglicherweise noch im Flug).
In Ihrem Iterator, könnten Sie tun:
BOOL stop = NO;
for(...) {
enumerationBlock(someObj, someIndex, &stop);
if (stop) break;
}
Dank, das funktioniert perfekt. Die Lösung zu dieser Frage finden Sie auch hier: http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C –