0

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

Répondre

0

vous pouvez appeler une fonction javascript pour faire le verrouillage si vous coincé avec cette solution

+0

pas quelque chose que je veux essayer, je veux garder le contrôle dans le fichier flash, sans aucune autre intervention extérieure. – Andy

0

D'accord, l'utilisation LocalConnection

En règle générale, vous ne devez pas utiliser Local SharedObjects pour synchroniser les éléments. La commande flush() n'a jamais fonctionné pour moi comme vous le souhaitez.

+0

Je vais essayer, merci. – Andy

+0

localconnection ne fonctionnait pas trop bien, avait quelques problèmes avec plus d'un connexions ouvertes :( – Andy

+0

Si vous avez ce problème, vous devez gérer plusieurs connexions ouvertes avec des ID générés en fonction de l'horodatage (avec une granularité juste assez petit pour que vous peut tenir compte du temps de chargement), ou implémenter une sorte de système de suivi. Par exemple, gérer un tableau avec la longueur du nombre de swfs dans un groupe donné .. incrémenter la partie correspondante du tableau chaque fois qu'un film de cette son type est chargé: seules les instances de type "like-index" peuvent communiquer entre elles, ou bien générer un ID de suivi flashvar pour chaque film d'une page. – michael