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

... Später ....Wie listen Sie über ein Array von Blöcken auf?

[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(); 
}]; 

Wie werfen Sie den Block aus, wenn über sie aufzählt? (Bonus, wenn Sie es ohne typedef tun können)

Antwort

0

von art-divin Kommentar dies wahrscheinlich eine bessere Art, es zu tun.

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]; 

... Später

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

Oder direkt in der Argumentliste:

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

+ 1 für die Argumentliste zu ändern - ich wusste nicht, dass Sie dies tun könnte! – Robert

+1

können Sie NSOperationQueue und - [NSOperation operationWithBlock:] anstelle des direkten Speicherns von Blöcken im Array verwenden. Wenn es eine Klasse für genau diesen Zweck (mit der Möglichkeit zum Starten/Stoppen der Ausführung) gibt, die von Apple-Entwicklern entwickelt wurde, dann sollten Sie definitiv einen verwenden. –

Verwandte Themen