2012-04-05 6 views
9

Ich bin etwas neu zu Blöcken und brauche etwas Hilfe. Ich möchte einen Block in einem NSDictionary speichern und den Block ausführen, wenn auf dessen key zugegriffen wird. Hier ist, was ich bisher als ein Beispiel habe.Wie kann ich Blöcke ausführen, die in einem NSDictionary gespeichert sind?

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

Ich nummeriere dann durch das Wörterbuch mit keyEnumerator. Ich weiß, dass der Block ordnungsgemäß gespeichert wird, da ich während der Aufzählung NSLog(@"%@", [blocks objectForKey:key]); aufrufen und <__NSGlobalBlock__: 0x100003750> abrufen. Ich weiß, dass ich darauf zugreifen kann, aber wie kann ich es an dieser Stelle ausführen?

Antwort

15

Try this:

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

Danke, das für mich gearbeitet. Mir ist jedoch aufgefallen, dass bei nachfolgenden Aufrufen zu jedem Block die gleichen Informationen wie bei der ersten Ausführung zurückgegeben werden, anstatt etwas zu enthalten, das sich seither geändert hat. Gibt es eine Möglichkeit, es bei jedem Aufruf auszuführen, anstatt die ursprüngliche Information zurückzugeben? – sud0

+2

Sie wird jedes Mal ausgeführt, erfasst jedoch externe Variablen beim Kopieren und nicht bei der Ausführung. –

0

Sie werfen müssen:

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

Ich bemerkte aber, dass, wenn nachfolgende Anrufe zu jedem Block gemacht werden es die gleichen Informationen liefert, wie wenn Es wurde zuerst ausgeführt, anstatt irgendetwas, das sich seither verändert hat, einzuschließen. Gibt es eine Möglichkeit, es bei jedem Aufruf auszuführen, anstatt die ursprüngliche Information zurückzugeben?

finden Sie in der Dokumentation auf Blöcke, nämlich der Abschnitt Types of Variable dem Titel:

Die folgenden Regeln gelten für Variablen innerhalb eines Blocks verwendet:

  • Stack (nicht statisch) Variablen, die für den umgebenden lexikalischen Bereich lokal sind, werden als const Variablen erfasst.

    Ihre Werte werden am Punkt des Blockausdrucks innerhalb des Programms genommen. In verschachtelten Blöcken wird der Wert vom nächsten umschließenden Bereich erfasst.

  • Variablen, die zum umschließenden lexikalischen Bereich gehören, der mit dem Speichermodifikator __block deklariert wurde, werden als Referenz bereitgestellt und sind daher änderbar.

    Alle Änderungen werden im umschließenden lexikalischen Bereich reflektiert, einschließlich aller anderen Blöcke, die innerhalb desselben umschließenden lexikalischen Bereichs definiert sind. Diese werden im Detail diskutiert in „The __block Speichertyp.“