Léger problème sur lequel j'ai réfléchi, j'ai une classe qui charge un texte à partir d'une url pour synchroniser l'heure. Le fichier swf peut être sur la même page plusieurs fois, mais je veux qu'il vérifie si l'un des swf se synchronise, si c'est le cas, attendez qu'il se termine et chargez sa valeur synchronisée (plutôt que d'interroger l'URL lui-même), de sorte qu'ils soient tous synchronisés avec la même valeur (du premier fichier swf à charger).AS3: Objets partagés Problème
J'essaie cette aide d'objets partagés, qui ressemble un peu à ce (snippets):
public function sync():void
{
sharedObject = SharedObject.getLocal("synctime", "/");
trace(sharedObject.data.startOfRequest, sharedObject.data.endTime);
if (((new Date().getTime() - 10000) < sharedObject.data.startOfRequest) && (sharedObject.data.endTime !== undefined))
{
loadUTCFromSharedObject();
}
else if (((new Date().getTime() - 10000) < sharedObject.data.startOfRequest) && (sharedObject.data.endTime == undefined))
{
timer.addEventListener(TimerEvent.TIMER, loadUTCFromSharedObject);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, startSync);
timer.start();
} else {
startSync()
}
}
private function startSync(e:Event = null)
{
var syncRequest:URLRequest = new URLRequest(TIMEURL + "?cb=" + Math.random());
var syncTimeLoader:URLLoader = new URLLoader();
syncTimeLoader.dataFormat = URLLoaderDataFormat.TEXT;
syncTimeLoader.addEventListener(Event.COMPLETE, syncTimeComplete);
syncTimeLoader.addEventListener(IOErrorEvent.IO_ERROR, syncTimeFailed);
sharedObject.clear();
startOfRequest = new Date();
sharedObject.data.startOfRequest = startOfRequest.getTime();
sharedObject.flush();
syncTimeLoader.load(syncRequest);
}
private function loadUTCFromSharedObject(e:Event = null):void
{
var sharedObjectCheck:SharedObject = SharedObject.getLocal("synctime", "/");
trace (sharedObject.data.endTime, sharedObjectCheck.data.endTime);
if (sharedObject.data.endTime !== undefined)
{
timer.removeEventListener(TimerEvent.TIMER, loadUTCFromSharedObject);
timer.removeEventListener(TimerEvent.TIMER_COMPLETE, startSync);
dispatchEvent(new LoadUTCTimeEvent(LoadUTCTimeEvent.SYNC_COMPLETE, null, null, sharedObject, true));
trace(sharedObject.data.UTCOffset);
}
}
private function syncTimeComplete(event:Event):void
{
var loadedText:URLLoader = URLLoader(event.target);
dispatchEvent(new LoadUTCTimeEvent(LoadUTCTimeEvent.SYNC_COMPLETE, loadedText.data, startOfRequest, sharedObject, false));
}
événement dispatcher:
public function LoadUTCTimeEvent(eventStatus:String, timeString:String = null, startOfRequest:Date = null, sharedObject:SharedObject = null, loadFromSharedObject:Boolean = false):void
{
super(eventStatus);
if (eventStatus == SYNC_COMPLETE) {
if (loadFromSharedObject == true) {
time = sharedObject.data.syncTime;
UTCOffset = sharedObject.data.UTCOffset;
}
else
{
//...snip....//
sharedObject.data.UTCOffset = UTCOffset;
sharedObject.data.syncTime = time;
sharedObject.data.endTime = curDate.getTime();
sharedObject.flush(1000);
}
}
}
Le problème que je reçois est que le 1er swf crée l'objet shared est correct, mais le second lit le paramètre endTime comme non défini, à moins que je n'actualise la page (c'est-à-dire qu'il ne capte pas les changements en direct). Est-ce que cette méthode n'est pas posible, devrais-je essayer une autre approche?
Merci d'avance.
Edit: a décidé d'ajouter une autre pile pour expliquer un peu plus: (as3) Sync data between 3 or more identical flash objects on the same page
pas quelque chose que je veux essayer, je veux garder le contrôle dans le fichier flash, sans aucune autre intervention extérieure. – Andy