Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   загрузка двух xml файлов (http://www.flasher.ru/forum/showthread.php?t=138658)

Karandash8 13.04.2010 15:40

загрузка двух xml файлов
 
здравствуйте!
у меня есть класс, в нем осуществляется загрузка двух xml файлов, после загрузки должно сгенерироваться событие. Вопрос в том как это лучше сделать? я это сделал следующим образом:
Код AS3:

public class XMLLoader extends Sprite {
                public var xmlMap:XML;
                public var xmlObjects:XML;
                private var ready:Boolean=false;
 
                //---------------------------------------------------------
                public function XMLLoader() {
                        var loaderMap:URLLoader=new URLLoader();
                        loaderMap.dataFormat=URLLoaderDataFormat.TEXT;
                        loaderMap.addEventListener(Event.COMPLETE,loadCompleteMap);
                        loaderMap.load(new URLRequest("map.xml"));
                        var loaderObjects:URLLoader=new URLLoader();
                        loaderObjects.dataFormat=URLLoaderDataFormat.TEXT;
                        loaderObjects.addEventListener(Event.COMPLETE,loadCompleteObjects);
                        loaderObjects.load(new URLRequest("staticObjects.xml"));
                }
                //---------------------------------------------------------
                private function loadCompleteMap(event:Event):void {
                        xmlMap=new XML(event.target.data);
                        if (ready==true) {
                                dispatchEvent(new Event("xmlLoaded",true));
                        } else {
                                ready=true;
                        }
                }
                //---------------------------------------------------------
                private function loadCompleteObjects(event:Event):void {
                        xmlObjects=new XML(event.target.data);
                        if (ready==true) {
                                dispatchEvent(new Event("xmlLoaded",true));
                        } else {
                                ready=true;
                        }
                }
        }

есть ли более гибкий подход? своего решения опасаюсь в следующем: а что если второй файл загрузится в тот момент когда первый уже сгенерировал событие, но еще не успел изменить значение переменной ready. Тогда получится что пользовательское событие никогда не сгенерируется. Иными словами это обычный параллелизм и доступ к общему ресурсу, отсюда и все вытекающие проблемы.

random13 13.04.2010 15:48

ну и, сделайте какой нить примитивный счетчик, который бы увеличивался на единицу каждый раз по свершению события

Karandash8 13.04.2010 15:50

по сути переменная ready эту роль и выполняет, но при этом остается описанная мною проблема с параллелизмом.

BeDLiNt 13.04.2010 15:55

Цитата:

если второй файл загрузится в тот момент когда первый уже сгенерировал событие, но еще не успел изменить значение переменной ready.
Тогда свойство ready поменяет второй файл. А первый увидит, что оно уже true.

random13 13.04.2010 15:58

ну а что добавьте ваши лодеры в массив например, когда происходить complete тупо увеличиваем на единицу и проверяем если количество равно двум то выполнить какие либо дальнейшие действия

Karandash8 13.04.2010 16:03

да действительно, сделал вариант со счетчиком:
Код AS3:

public class XMLLoader extends Sprite {
                public var xmlMap:XML;
                public var xmlObjects:XML;
                private var ready:int=0;
 
                //---------------------------------------------------------
                public function XMLLoader() {
                        var loaderMap:URLLoader=new URLLoader();
                        loaderMap.dataFormat=URLLoaderDataFormat.TEXT;
                        loaderMap.addEventListener(Event.COMPLETE,loadCompleteMap);
                        loaderMap.load(new URLRequest("map.xml"));
                        var loaderObjects:URLLoader=new URLLoader();
                        loaderObjects.dataFormat=URLLoaderDataFormat.TEXT;
                        loaderObjects.addEventListener(Event.COMPLETE,loadCompleteObjects);
                        loaderObjects.load(new URLRequest("staticObjects.xml"));
                }
                //---------------------------------------------------------
                private function loadCompleteMap(event:Event):void {
                        xmlMap=new XML(event.target.data);
                        ready++;
                        loadComplete();
                }
                //---------------------------------------------------------
                private function loadCompleteObjects(event:Event):void {
                        xmlObjects=new XML(event.target.data);
                        ready++;
                        loadComplete();
                }
                //---------------------------------------------------------
                private function loadComplete() {
                        if (ready==2) {
                                dispatchEvent(new Event("xmlLoaded",true));
                        }
                }
        }


BeDLiNt 13.04.2010 16:06

Цитата:

да действительно, сделал вариант со счетчиком
На самом деле вы сделали с точностью тоже самое, что и в первый раз. Но, так как у вас всего два объекта, то хватало булевой переменной.

random13 13.04.2010 16:07

вобщем то да, хватало бы и булевой


Часовой пояс GMT +4, время: 13:33.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.