SKAction runAction führt keinen Beendigungsblock aus

8

A SKSpriteNode ist Kind eines SKNode und wird für Speicherzwecke in einem Array von SKSpriteNode abgelegt.

Diese SKSpriteNode wird mit einer Animation gelöscht. Am Ende dieser Animation wird ein Completion-Block ausgeführt, um einige Anweisungen auszuführen ...

Das Löschen muss sowohl in den übergeordneten Elementen SKSpriteNode als auch im Array erfolgen. Abhängig von der Reihenfolge dieser 2 Löschungen ist das Ergebnis korrekt oder nicht:

  • Wenn SKSpriteNode aus 1 / dem Array gelöscht wird, dann 2 / aus den SKNode Eltern, wird der Completion Block ausgeführt.
  • Wenn die umgekehrte Reihenfolge, 1 / SKNode Eltern ist dann 2 / das Array, wird der Completion-Block nicht ausgeführt.

Warum dieses Verhalten?

%Vor%

Die Abschlussmeldung wird angezeigt.

Wenn nun removeFromParent vor der Aktion 'remove from theGrid ' platziert wird, wird die Vervollständigung nicht wie folgt ausgeführt:

%Vor%     
Dominique Vial 02.06.2015, 14:34
quelle

1 Antwort

11

Aus der SKAction Referenz :

  

Ein SKAction-Objekt ist eine Aktion, die von einem Knoten im. ausgeführt wird   scene (SKScene) ... Wenn die Szene ihre Knoten verarbeitet, werden Aktionen mit diesen verknüpft   Knoten werden ausgewertet.

Mit anderen Worten, die Aktionen für einen Knoten werden genau dann ausgeführt, wenn dieser Knoten in der Szene ist. Indem Sie removeFromParent aufrufen, entfernen Sie den Knoten aus der Szene, die Aktion runBlock wird nie aufgerufen (da der Knoten nicht mehr in der Szene ist), und somit ist die Sequenz niemals beendet. Da die Sequenz nicht abgeschlossen wird, wird der Completion-Block nicht aufgerufen.

Ich würde vorschlagen, den Aufruf removeFromParent aus Sicherheitsgründen in den Completion-Block zu verschieben. So etwas fühlt sich sicherer an:

%Vor%

TL; DR
Die Sequenz wird nicht abgeschlossen, daher wird der Completion-Block für die Sequenz nicht aufgerufen.

    
Ben Kane 02.06.2015, 15:39
quelle

Tags und Links