2013-04-07 8 views

Odpowiedz

13

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; 
} 
+0

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 –

6

Poniższy kod definiuje metodę, która przyjmuje jako parametr bloku i utrzymuje go aż shouldStop wykonywania jest ustawiony NO przez blok.

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

Wyjaśnienie jest dość proste. Blok to funkcja, która pobiera pewne parametry. W tym przypadku przekazujemy jako parametr wskaźnik do posiadanej przez nas zmiennej BOOL. W ten sposób pozwalamy blokowi ustawić tę zmienną i - w tym przypadku - wskazujemy, że pętla powinna się zatrzymać.

W tym momencie, blok przeszedł mógłby zrobić coś takiego

[self myMethod:^(BOOL *stop) { 
     if (arc4random_uniform(1)) { 
      *stop = YES; 
     } 
}]; 
Powiązane problemy