2012-04-05 14 views
9

Soy algo nuevo en los bloques y necesito ayuda. Quiero almacenar un bloque en un NSDictionary y ejecutar dicho bloque cuando se acceda a partir de su key. Esto es lo que tengo hasta ahora como un ejemplo.¿Cómo puedo ejecutar bloques almacenados en un NSDictionary?

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

entonces enumerar a través de diccionario mediante keyEnumerator. Sé que el bloque se está almacenando correctamente porque llamo al NSLog(@"%@", [blocks objectForKey:key]); durante la enumeración y obtengo el <__NSGlobalBlock__: 0x100003750>. Entonces sé que puedo acceder a él, pero ¿cómo puedo ejecutarlo en este momento?

Respuesta

15

Prueba esto:

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

Gracias, esto funcionó para mí. Sin embargo, noté que cuando se hacen llamadas subsecuentes a cada bloque, se devuelve la misma información que cuando se ejecutó por primera vez, en lugar de incluir cualquier cosa que pueda haber cambiado desde entonces. ¿Hay alguna manera de hacer que se ejecute cada vez que se llama en lugar de devolver la información original? – sud0

+2

Se ejecuta cada vez, pero captura variables externas cuando se copia, en lugar de cuando se ejecuta. –

0

, es necesario especificar:

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

me di cuenta, sin embargo, que cuando se hacen las llamadas posteriores a cada bloque se devuelve la misma información que cuando primero se ejecutó en lugar de incluir todo lo que pudo haber cambiado desde entonces. ¿Hay alguna manera de hacer que se ejecute cada vez que se llama en lugar de devolver la información original?

Consulte la documentación en bloques, específicamente la sección titulada Types of Variable:

Las siguientes reglas se aplican a las variables utilizadas dentro de un bloque:

  • Stack (no estático) las variables locales al alcance léxico adjunto se capturan como variables const.

    Sus valores se toman en el punto de la expresión de bloque dentro del programa. En bloques anidados, el valor se captura desde el alcance circundante más cercano.

  • Las variables locales del alcance léxico adjunto declarado con el modificador de almacenamiento __block se proporcionan por referencia y son mutables.

    Cualquier cambio se refleja en el alcance léxico que lo incluye, incluyendo cualquier otro bloque definido dentro del mismo alcance léxico circundante. Estos se discuten con más detalle en “El Tipo __block de almacenamiento”.

Cuestiones relacionadas