Methode mit eigenem completion block

Hallo Zusammen,

seit einiger Zeit gibt es ja bereits Methoden mit completion blocks, die uns die Arbeit erleichtern. In diesem Tutorial erkläre ich wie man seine eigene Methode mit completion block schreibt.

Ein typisches Beispiel aus SpriteKit ist

[node runAction:[SKAction moveTo:CGPointZero duration:2.0f] completion:^{
        [node removeFromParent];
 }];

Nachdem eine node die definierte SKAction ausgeführt hat wird der completion block aufgerufen und die node mit removeFromParent entfernt. Und so definiert man sich eine eigene Methode mit completion block.

-(void)makeVisualAtPos:(CGPoint)pos completion:(void (^)())block {
    
    SKSpriteNode *effectNode = [[SKSpriteNode alloc] initWithImageNamed:@"effect.png"];
    effectNode.position = pos;
    [self addChild:effectNode];

    // do some cool stuff
    [effectNode runAction:[SKAction animateWithTextures:effectArray timePerFrame:0.1 resize:YES restore:NO] completion:^{
        block();
    }];
}

In der Methode werden ein paar tolle Effekte erstellt. Wenn die Effekte erfolgt sind, soll der nächste Schritt durchgeführt werden. Was genau der nächste Schritt jedoch ist, wird beim Aufruf der Methode als block definiert. In makeVisualAtPos arbeiten wir einfach unsere Effekte ab und rufen den Block per block() auf, sobald wir fertig sind.

Aufgerufen wird das ganze dann so:

[self makeVisualAtPos:CGPointMake(200,200) completion:^{
   // nachfolgende Aktionen 
   // z.B. so etwas wie [self proceedGame];
}];

Und natürlich kann man auch Variablen aus der Methode an den Aufruf zurückgeben.

-(void)makeVisualAtPos:(CGPoint)pos completion:(void (^)(BOOL success))block {
   // do cool stuff
   // irgendwann dann eben
   block(YES);     
   // oder block(NO);
}

Selbstverständlich muss der Aufruf dann auch angepasst werden.

[self makeVisualAtPos:CGPointMake(200,200) completion:^(BOOL success){
   // nachfolgende Aktionen 
   if (success) [self proceedGame];
}];

Bis bald.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.