2013-04-26 7 views
8
self.myArray = @[ [^{ NSLog(@"a"); } copy], 
        [^{ NSLog(@"b"); } copy]]; 

... Più tardi ....Come si enumera su una serie di blocchi?

[self.myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    // This syntax is wrong, but I hope you get my intention 
    void (^) (void) block = obj; 
    block(); 
}]; 

Come si scacciati il ​​blocco durante l'enumerazione su di esso? (Bonus se è possibile farlo senza un typedef)

risposta

0

Dal commento di art-divin questo è probabilmente un modo migliore di farlo.

NSOperation* aOp = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"a");}]; 
NSOperation* bOp = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"b");}]; 

NSOperationQueue* opQueue = [[NSOperationQueue alloc] init]; 
[opQueue setSuspended:YES]; 
[opQueue addOperation:aOp]; 
[opQueue addOperation:bOp]; 

... Più tardi

[opQueue setSuspended:NO]; 
1

questo dovrebbe funzionare:

void (^block)(void) = obj; 
10
[self.myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    void (^block)() = obj; 
    block(); 
}]; 

O direttamente nella lista degli argomenti:

[self.myArray enumerateObjectsUsingBlock:^(void (^block)(), NSUInteger idx, BOOL *stop) { 
    block(); 
}]; 
+2

+ 1 per modificare la lista degli argomenti - Non sapevo che si possa fare questo! – Robert

+1

è possibile utilizzare NSOperationQueue e - [NSOperation operationWithBlock:] invece di salvare direttamente i blocchi nell'array. Se c'è una classe per questo scopo esatto (con possibilità di avviare/fermare l'esecuzione) progettata dagli sviluppatori Apple, dovresti sicuramente usarne una. –

Problemi correlati