AS3 Signals: Alternative zu Flashevents?

In letzter Zeit bin ich öfters über das Projekt „AS3 Signals” von Robert Penner gestoßen. Es handelt sich um einen alternativen Ansatz zur normalen Events-Klasse in Flash.

Signals is a new approach for AS3 events, inspired by C# events and signals/slots in Qt. […] Wire your application with better APIs and less boilerplate than AS3 Events.

Die AS3-Signals sind leicht zu verwenden, wie die folgenden Beispiele zeigen. Interessant ist, dass die Signale immer Bestandteile der Klasse in Form von Attributen sind.

Der Vorteil gegenüber Flashevents: Man muss keine eigenen Eventklassen schreiben. Außerdem müssen die Listener nicht auf Event-Stringkonstanten hören, weil man sich an echten Objekten registriert.

Codebeispiele zu AS3Signals

Ein kurzes Beispiel: Ein Objekt der Klasse org.florianplag.MP3Player hat eine öffentliche Eigenschaft mit dem Namen turnedOn (= das Signal). Wird der MP3Player eingeschaltet, soll dieses Signal ausgelöst werden.

Intern in der Klasse passiert das Feuern des Signals mit turnedOn.dispatch() (analog zum Dispatchen eines Flashevents).

[as]
package org.florianplag {
import org.osflash.signals.Signal;

public class MP3Player {

public var turnedOn:Signal = new Signal();

public function MP3Player() {
}

public function turnOn():void {
// Signal feuern
turnedOn.dispatch();
}

}
}
[/as]

Möchte man nun von außerhalb einen Listener für das Signal hinzufügen, geschieht dies mit mp3Player.turnedOn.add(...) (= das Pendant zu addEventListener).

[as]
package {
import org.florianplag.MP3Player;
import flash.display.Sprite;

public class SimpleExample extends Sprite {
private var mp3Player : MP3Player = new MP3Player();

public function SimpleExample() {
// Listener für Signal hinzufügen
mp3Player.turnedOn.add(doSomething);

// MP3Player anschalten
mp3Player.turnOn();
}

private function doSomething():void {
trace („MP3Player eingeschaltet“);
}

}
}
[/as]

Weitere Methoden

Mit remove kann man den Listener wieder entfernen. removeAll entfernt alle Listener.

Nett: Möchte nur genau einmal auf ein Signal hören, gibt es neben der add-Methode auch addOnce(doSomethingOnlyOneTime).

Ãœbergabe von Werten

Möchte man Werte oder Objekte als Payload mit dem Signal übertragen, ist dies auch sehr einfach gelöst.

Beim Erstellen des Signals gibt man einen Datentyp bzw. eine Klasse an. Im Beispiel ist dies ein String.
[as]
public class MP3PlayerPayload {

// es soll ein String übergeben werden
public var turnedOn:Signal = new Signal(String);

public function MP3PlayerPayload() {
}

public function turnOn():void {
// Signal feuern
turnedOn.dispatch(„Guten Morgen vom MP3 Player!“);
}

}
[/as]

Auf Empfängerseite muss man den Stringparameter dann einfach in der Funktion hinzufügen, die als Reaktion auf das Signal ausgeführt wird.
[as]
// Listener für Signal hinzufügen
mp3Player.turnedOn.add(doSomething);

// MP3Player anschalten
mp3Player.turnOn();
}

private function doSomething(message:String):void {
trace (message);
}
[/as]

Dies waren sehr einfache Beispiele. Selbstverständlich lassen sich mit Signals auch die üblichen Fälle abbilden wie MouseEvents, Verursacher des Signals, etc. Ich empfehle das unten verlinkte Videotutorial, das die Möglichkeiten der AS3Signal schön aufzeigt.

Was haltet ihr von dem Ansatz?

Link: AS3 Signals Tutorial (Video Tutorial)
Link: AS3 Signals

[ad]

11 Gedanken zu „AS3 Signals: Alternative zu Flashevents?“

  1. Gibt es bei diesem System auch einen Performancegewinn ?
    Weil Events kann man auch alle in einer Event-Klasse unterbringen, und mit einem Object-Parameter im Konstruktor alle möglichen Daten übergeben.

  2. Hi,

    danke für den Artikel. Find ich generell sehr gut den Ansatz. Ich glaube vor allem für Objekte ausserhalb der DisplayList ist dieser Ansatz sehr effektiv und sauber zu implementieren. Ich will aber eigentlich in der DisplayList nicht auf Events verzichten die bubblen.

    Gruss Alex

  3. Hallo Florian,

    ich verwende die Signals gerade in Verbindung mit Robotlegs und muss sagen, dass es den Code schön sauber hält und das ewige Events extenden ist auch vorbei. Sehr guter Ansatz!

    Greetz,
    Alex

  4. @Georg: Gute Frage. Ich habe dazu noch nichts gelesen.

    @Peter: Viel Spaß. Kannst ja mal berichten.

    @Sebastian: Interessant, kannte ich nicht.

    @Alexander: Da könntest du recht haben. Kann ich aber noch nicht wirklich beurteilen.

    @Alex: Das würde mich interessieren. Hast du hierzu ein Beispiel, wie du das genau machst?

  5. Hi Flo,

    wegen der Signals und Robotlegs:
    sieh doch mal ins Repo von Joel, da ist einiges dabei was sich sehr interessant liest, bin gerade bei der State Machine :)

    Auch ein nettes Konzept.

    link: http://github.com/joelhooks

    Bei Fragen… Email ist ja im Feld.

    Grüße,
    Alex

  6. Ah, okay. Das muss ich mir in einer bei Gelegenheit mal in Ruhe anschauen. Das mit der StateMachine klingt auch interessant.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert