2009-03-18 4 views
1

Actuellement, je travaille sur une application (Flex) qui utilise intensivement des SWF externes. Je voudrais créer une méthode statique qui prend un nom de fichier comme argument et renvoie SWF enveloppé dans une autre classe.En attente pendant que SWFLoader charge un fichier swf

public static function getSWFWrapperFromFile(path:string):SWFWrapper { 
    var loader:SWFLoader = new SWFLoader(); 
    loader.addListener(Event.COMPLETE, onLoad); 
    loader.load(path); 
    // If I create new SWFWrapper object here and try to assign it the loader.content I get null reference 

    } 

Cependant, avec cette approche, je ne suis pas en mesure d'encapsuler la logique dans une fonction, à cause de la charge non-blocage() et la nécessité de gestionnaire onLoad. Est-il possible de forcer un délai après l'appel de la méthode load? Ou mayber il y a un autre, une meilleure façon?

Merci, Alonzo

Répondre

0

Vous devez attendre jusqu'à ce que votre objet Loader terminé. Essayez d'ajouter un gestionnaire d'événement. Oui, le tout devient trouble après un certain temps quand vous avez plusieurs chargeurs et que vous devez attendre que le dernier soit terminé. Mais c'est comme ça si vous utilisez SWFLoader.

0

En flash, vous ne pouvez pas bloquer dans une méthode - vous devez toujours utiliser le gestionnaire onLoad pour charger les données. (Le modèle d'exécution as3 est mono-thread, si vous bloquez dans une méthode, le reste du programme ne sera pas exécuté)

0

Comme d'autres l'ont dit, vous ne pouvez pas faire cela. Cependant, jetez un oeil à la bibliothèque AS3 BulkLoader, qui prend la charge de gérer plusieurs chargeurs simultanément et d'attendre leur achèvement, de votre épaule. Il est bien documenté et ne nécessite que quelques lignes à utiliser.

1

La liste d'affichage est bien conçue pour le chargement asynchrone. Vous remarquerez que Loader est une classe dérivée de DisplayObject et peut donc être placée directement dans la liste d'affichage. Lorsque son contenu est chargé, il sera un enfant du chargeur. Ainsi, si SWFWrapper est dérivé de DisplayObject, vous pouvez simplement faire ce qui suit à la fin de votre code:


var wrapper:SWFWrapper = new SWFWrapper(); 
wrapper.addChild(loader); 
return wrapper; 
Questions connexes