Ostatnio często korzystam z usługi enumerateObjectsUsingBlock:
w celu szybkiego wyliczenia. Mam trudności ze zrozumieniem korzystania z BOOL *stop
w bloku wyliczeniowym.Co to jest argument zatrzymania BOOL * dla enumerateObjectsUsingBlock: używany dla?
W NSArray
klasy stany referencyjne
stop
: Odwołanie do wartości logicznej. Blok może ustawić wartość naYES
na zatrzymać dalsze przetwarzanie tablicy. Argumentstop
jest argumentem tylko-out. Powinieneś tylko ustawić tę wartość logiczną naYES
w bloku .
Więc oczywiście mogę dodać następujących w moim bloku, aby zatrzymać wyliczanie:
if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}
od tego, co byłem w stanie powiedzieć, które nie są wyraźnie ustalone *stop
do YES
nie ma jakiekolwiek negatywne skutki uboczne. Wyliczenie wydaje się automatycznie zatrzymywać na końcu tablicy. Czy w bloku jest potrzebne naprawdę *stop
?
Należy zauważyć, że flaga 'stop' ma charakter doradczy; wyliczanie może być kontynuowane dla pewnej niezdefiniowanej liczby iteracji w przypadku równoczesnym. To znaczy. nie powinieneś ustawiać zmiennej '__block' bezwarunkowo przy każdym przejściu przez wyliczenie i oczekiwać, że będzie to" ostatnia "wartość, gdy użyjesz' stop' do wcześniejszego zakończenia. Powinieneś zawsze łączyć "nie, używaj tego obiektu" z ustawieniem 'stop = YES;'. – bbum
@bbum, czy możesz wyjaśnić, czy ciągłe zachowanie odnosi się wyłącznie do równoległego wyliczenia? Chociaż jest to całkowicie zrozumiałe w tym przypadku, nie jest udokumentowane i byłoby dość zaskakującym bite w dupę dla "seryjnego" wyliczenia. –