stop
flaga jest używany tak:
[coll enumerateUsingBlock:^(id o, NSUInteger i, BOOL *stop) {
if (... check for stop ...) {
*stop = YES;
return;
}
}];
Kiedy powraca blokowe wyliczenie sprawdza kolekcja *stop
. Jeśli jest to YES
, przestaje wyliczać.
Jest zaimplementowany w ten sposób, w przeciwieństwie do wartości zwracanej, ponieważ pozwala to na jednoczesne wyliczanie bez sprawdzania wartości zwracanej bloku (co wiązałoby się z narzutem). To znaczy. w równoczesnym wyliczaniu kolekcja może dowolną liczbę równoczesnych iteracji i okresowo sprawdzać *stop
. Ilekroć *stop
przechodzi na , przestaje planować więcej bloków (dlatego też flaga stop
nie jest twardym stopem, a niektóre nieokreślone liczby iteracji wciąż mogą być w locie).
W swojej iterator, można zrobić:
BOOL stop = NO;
for(...) {
enumerationBlock(someObj, someIndex, &stop);
if (stop) break;
}
Dzięki, działa to doskonale. Rozwiązanie tego pytania można również znaleźć tutaj: http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C –