PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Synchronisierung mit SharedObjects


pate33
26.09.2006, 12:37
moin moin,

ich habe (wie jeden Tag) mal wieder ein Problem mit Flash. :)

Aufbau: 1 Flash Media Server (installiert auf einem Win2k3 Server) und 2 Clients.

Ablauf: Client 'A' verbindet zum Server, fraegt in einem SharedObject 'so' ab, ob bereits der Wert 'erster' gesetzt wurde, wenn nicht, dann setzt er den Wert 'erster' auf 'A'. Client 'B' verbindet, fragt den Wert 'erster' im SharedObject 'so' ab und bemerkt, dass der Wert bereits von 'A' gesetzt wurde.

So funktioniert es in meinem Kopf, aber nicht im Flash. ;) Bei der Abfrage auf den Wert 'erster' von Client 'B' kommt 'undefined', obwohl der Wert im SharedObject 'so' gesetzt ist. Erst, nachdem 'B' versucht den Wert zu ueberschreiben und ein 'rejected' bekommt weiss er, dass bereits was drin steht. Was natuerlich ziemlich bescheuert ist, denn es kann ja auch sein, dass irgendwann mal kein 'rejected' zurueck kommt und der Wert einfach ueberschrieben wird.

Mach ich da was falsch mit den SharedObjects? Warum funktioniert das nicht?

Danke. :)


mnemonic
26.09.2006, 13:31
Bei der Abfrage auf den Wert 'erster' von Client 'B' kommt 'undefined', obwohl der Wert im SharedObject 'so' gesetzt ist.
Wie versuchst Du herauszufinden ob die Property gesetzt, bzw. welchen Wert sie hat (bitte genauen Code posten).
Liefert Dir die "connect" Methode "true" zurück?
Was macht Deine "onSync" Methode nach dem "connect" (Code!)?

pate33
26.09.2006, 13:55
Property-Abfrage: so.data.erster == undefined;
Property-Ergebnis: 'undefined'
Property-Wert in der Management Console: 'A';

bei den SharedObjects gibt es keine Abfrage, ob die Verbindung steht oder nicht, aber ich gehe davon aus. Wie gesagt, nach einem erfolglosen Schreibvorgang kann ich den Wert auch auslesen.

so = SharedObject.getRemote("sharedobject", nc.uri, true);
so.connect(nc);
if(so.data.erster == undefined) {
so.data.erster = cId;
}

mnemonic
26.09.2006, 14:08
Wie gesagt, nach einem erfolglosen Schreibvorgang kann ich den Wert auch auslesen.

so = SharedObject.getRemote("sharedobject", nc.uri, true);
so.connect(nc);
if(so.data.erster == undefined) {
so.data.erster = cId;
}

Und genau an dieser Stelle wittere ich den Fehler.
Die Doku besagt, dass Flash nach einem geglückten "connect" erst einmal ein "onSync" will und genau das solltest Du wahrscheinlich beherzigen.
Ich würde den Code dahingehend abändern, dass die Abfrage ob die Property "erster" gesetzt ist, erst nach dem ersten onSync geschieht.
Wahrscheinlich solltest Du clientseitig eine Property auf dem SharedObject anlegen, die nur dazu dient anzuzeigen, ob das SharedObject sein erstes onSync hinter sich hat.
Beispiel:
var my_so : SharedObject = SharedObject.getRemote([...]);
my_so.isInitialized = false;
my_so.onSync = function() {
if(!this.isInitialized) {
// Überprüfung auf Property hier rein
this.isInitialized = true;
}
[...]
}
my_so.connect([...]);

Auf dem Weg sollte das Problem verlässlich zu kontrollieren sein.

pate33
26.09.2006, 14:30
ne, das geht so auch nicht. Das onSync muss erst einmal komplett durchgelaufen sein. Erst beim naechsten mal sind die Daten abrufbar. Ich habe jetzt mal versucht, direkt nach dem connect() ein property-change durchzufuehren, um ein onSync() herbeizurufen. Leider wird der Code auf dem Client schneller abgearbeitet, als das onSync() durch ist. :( Mal schauen wie ich da weiter komme, aber der Ansatz ist super, danke. :)

pate33
26.09.2006, 14:38
ich hab mir jetzt ein Property 'sync' in dem SharedObject gesetzt. Bei jedem onSync() wird abgefragt, ob ein Wert gesetzt ist. Falls nicht passiert nichts. :)

So funktionerts. :)