9
votes

Comment puis-je exécuter des blocs stockés dans un NSDictionary?

Je suis un peu nouveau pour bloquer et avoir besoin d'aide. Je souhaite stocker un bloc dans un NSDictionary code> et exécuter ledit bloc lorsqu'il est accédé en fonction de la clé code>. Voici ce que j'ai jusqu'à présent qu'un exemple.

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


0 commentaires

3 Réponses :


15
votes

Essayez ceci:

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


2 commentaires

Merci, cela a travaillé pour moi. Je remarquai cependant que lorsque lorsque les appels ultérieurs sont apportés à chaque bloc, cela renvoie les mêmes informations que lorsqu'elle a été exécutée pour la première fois plutôt que d'inclure tout ce qui pourrait avoir changé depuis. Existe-t-il un moyen de le faire exécuter à chaque fois que c'est appelé plutôt que de renvoyer les informations originales?


Il s'exécute à chaque fois, mais il capture des variables externes quand elle est copiée, plutôt que lorsqu'elle est exécutée.



1
votes

Vous devez lancer:

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


0 commentaires

4
votes

J'ai remarqué que, lorsque lorsque des appels ultérieurs sont apportés à chaque bloc, il renvoie les mêmes informations que lorsqu'elle a été exécutée pour la première fois que d'inclure tout ce qui pourrait avoir changé depuis. Existe-t-il un moyen de le faire exécuter à chaque fois que c'est appelé plutôt que de renvoyer les informations originales?

Reportez-vous à la documentation sur les blocs, spécifiquement la section intitulée Types de variable :

Les règles suivantes s'appliquent aux variables utilisées dans un bloc:

  • Pile (non statique) Les variables locales à la portée lexicale enfermante sont capturées sous forme de variables const .

    Leurs valeurs sont prises au point de l'expression de bloc dans le programme. Dans des blocs imbriqués, la valeur est capturée de la portée de la société la plus proche.

  • variables locales à la portée lexicale enfermée déclarée avec le modificateur de stockage __ (code> est fourni par référence et sont mutables.

    Toute modification est reflétée dans la portée lexicale enfermante, y compris tout autre bloc défini dans la même portée lexicale enfermante. Ceux-ci sont discutés plus en détail dans "le type de stockage __block".


0 commentaires