2012-04-05 14 views
9

Sono un po 'nuovo ai blocchi e ho bisogno di aiuto. Voglio memorizzare un blocco in un NSDictionary ed eseguire tale blocco quando si accede in base al suo key. Ecco quello che ho finora ad esempio.Come posso eseguire i blocchi memorizzati in un NSDictionary?

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

Quindi si enumera attraverso il dizionario utilizzando keyEnumerator. So che il blocco viene archiviato correttamente perché chiamo NSLog(@"%@", [blocks objectForKey:key]); durante l'enumerazione e ottengo <__NSGlobalBlock__: 0x100003750>. Quindi so che posso accedervi, ma come posso eseguirlo a questo punto?

risposta

15

Prova questo:

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

Grazie, questo ha funzionato per me. Ho notato, tuttavia, che quando le chiamate successive vengono fatte a ciascun blocco, restituisce le stesse informazioni di quando è stato eseguito per la prima volta piuttosto che includere tutto ciò che può essere cambiato da allora. C'è un modo per farlo eseguire ogni volta che viene chiamato piuttosto che restituire le informazioni originali? – sud0

+2

Viene eseguito ogni volta, ma cattura le variabili esterne quando è copiato, piuttosto che quando viene eseguito. –

0

È necessario lanciare:

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

ho notato, però, che quando le chiamate successive sono fatti per ogni blocco restituisce le stesse informazioni quando è stato prima eseguito piuttosto che includere tutto ciò che potrebbe essere cambiato da allora. C'è un modo per farlo eseguire ogni volta che viene chiamato piuttosto che restituire le informazioni originali?

fare riferimento alla documentazione sui blocchi, in particolare la sezione intitolata Types of Variable:

valgono le seguenti regole per variabili utilizzate all'interno di un blocco:

  • Stack (non statico) le variabili locali per l'ambito lessicale che li include vengono catturate come variabili const.

    I loro valori vengono presi nel punto dell'espressione di blocco all'interno del programma. Nei blocchi nidificati, il valore viene catturato dall'ambito di chiusura più vicino.

  • Le variabili locali per l'ambito lessicale allegato dichiarate con il modificatore di memoria __block sono fornite per riferimento e quindi sono modificabili.

    Eventuali modifiche si riflettono nello scope lessicale che lo racchiude, inclusi eventuali altri blocchi definiti all'interno dello stesso ambito lessicale allegato. Questi sono discussi in modo più dettagliato in “The Type __block bagagli.”

Problemi correlati