2012-04-05 9 views
9

Jestem trochę nowy w blokach i potrzebuję pomocy. Chcę przechowywać blok w NSDictionary i wykonać ten blok, gdy jest on dostępny w oparciu o jego numer key. Oto, co mam do tej pory jako przykład.Jak mogę wykonać bloki przechowywane w NSDictionary?

NSDictionary *blocks = [NSDictionary dictionaryWithObjectsAndKeys: 
           ^{NSLog(@"Log Block 1");}, @"Block1", 
           ^{NSLog(@"Log Block 2");}, @"Block2", 
           nil]; 

I następnie wyliczyć za pomocą słownika za pomocą keyEnumerator. Wiem, że blok jest przechowywany poprawnie, ponieważ podczas wyliczenia dzwonię pod numer NSLog(@"%@", [blocks objectForKey:key]); i otrzymuję <__NSGlobalBlock__: 0x100003750>. Więc wiem, że mogę uzyskać do niego dostęp, ale jak mogę go wykonać w tym momencie?

Odpowiedz

15

Spróbuj tego:

void(^myAwesomeBlock)() = [blocks objectForKey:key]; 
myAwesomeBlock(); 
+0

Dzięki, to pracował dla mnie. Zauważyłem jednak, że gdy kolejne wywołania są wykonywane do każdego bloku, zwracają te same informacje, co przy pierwszym uruchomieniu, niż zawierają wszystko, co mogło się zmienić od tego czasu. Czy istnieje sposób na wykonanie go za każdym razem, gdy jest wywoływany zamiast zwracania pierwotnej informacji? – sud0

+2

Jest wykonywany za każdym razem, ale przechwytuje zmienne zewnętrzne podczas ich kopiowania, a nie kiedy jest wykonywany. –

0

Trzeba obsada:

id bar = [blocks objectForKey:@"Block1"]; 
((void(^)())bar)(); 
4

Zauważyłem jednak, że gdy kolejne wywołania są do każdego bloku zwraca te same informacje, kiedy najpierw zostało wykonane, a nie zawierało wszystko, co mogło się zmienić od tego czasu. Czy istnieje sposób na wykonanie go za każdym razem, gdy jest wywoływany zamiast zwracania pierwotnej informacji?

można znaleźć w dokumentacji na blokach, a konkretnie sekcja zatytułowana Types of Variable:

Poniższe zasady odnoszą się do zmiennych wykorzystywanych w bloku:

  • stos (non-static) zmienne lokalne do otaczającego zakresu leksykalnego przechwytywane są jako zmienne const.

    Ich wartości są pobierane w punkcie wyrażenia bloku w programie. W zagnieżdżonych blokach wartość jest przechwytywana z najbliższego otaczającego zakresu.

  • Zmienne lokalne do otaczającego zakresu leksykalnego zadeklarowanego za pomocą modyfikatora pamięci __block są dostarczane przez odniesienie i dlatego można je zmieniać.

    Wszelkie zmiany znajdują odzwierciedlenie w otaczającym zakresie leksykalnym, w tym w innych blokach zdefiniowanych w tym samym rozszerzającym się zakresie leksykalnym. Są one omówione bardziej szczegółowo w „rodzaju __block Storage”.