Форум 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=134144)

proxiServer 22.12.2009 18:19

random13 Понял. Не умею вешать слушатели. Буду разбираться. Вопрос! Я сильно проиграю в производительности и размере флешки, если буду использовать эту библиотеку? По сути там реализовано как раз то что вы описали. Ведь удобная же, да?)

Zebestov 22.12.2009 18:34

У меня было удобно все COMPLETE отрабатывать в одном методе — он складывал полученные XML в массив, инкрементировал некую переменную и сравнивал ее с ожидаемым количеством загруженных данных. Если больше — шел дальше: перебирал массив и в зависимости от имени корневого элемента отсылал на тот или иной парсер.
Сделай так же. Даже если у тебя обработчики разные (ну например ты парсишь сразу или еще что-то) — вынеси инкремент с проверкой в отдельную функцию и вызывай ее в каждом своем обработчике.

proxiServer 23.12.2009 10:52

Zebestov, а можно код? Я даже понять не могу что не могу понять) Вроде все отдельные слова понимаю, а все вместе не складывается(

silin 23.12.2009 11:36

Код AS3:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.net.*;
        import flash.utils.*;
 
        public class Main extends Sprite
        {
                private var _map:Dictionary = new Dictionary();
                private var _counter:int;
 
                public function Main():void
                {
 
                        var urls:Array = ["xml1.xml", "xml2.xml"];
                        var parsers:Array = [parser1, parser2];
                        _counter = urls.length;
                        for (var i:int = 0; i < _counter; i++)
                        {
                                var loader:URLLoader = new URLLoader(new URLRequest(urls[i]));
                                loader.addEventListener(Event.COMPLETE, onLoadComplete);
                                loader.addEventListener(IOErrorEvent.IO_ERROR, onLoadError);
                                _map[loader] = parsers[i];
                        }
 
                }
 
                private function onLoadError(evnt:IOErrorEvent):void
                {
                        trace( "Main.onLoadError > evnt : " + evnt );
                        if (--_counter == 0) startApp();//или не старт, дело хозяйское
                }
 
                private function onLoadComplete(evnt:Event):void
                {
                        evnt.target.removeEventListener(Event.COMPLETE, onLoadComplete);
                        var data:XML = new XML(evnt.target.data);
                        var parser:Function = _map[evnt.target];
                        parser(data);
                        if (--_counter == 0) startApp();
 
                }
                private function startApp():void
                {
                        trace( "Main.startApp" );
 
                }
                private function parser1(data:XML):void
                {
                        trace( "Main.parser1 > data : " + data );
 
                }
                private function parser2(data:XML):void
                {
                        trace( "Main.parser2 > data : " + data );
 
                }
        }
 
}


random13 23.12.2009 12:57

Цитата:

Сообщение от proxiServer (Сообщение 874344)
random13 Понял. Не умею вешать слушатели. Буду разбираться. Вопрос! Я сильно проиграю в производительности и размере флешки, если буду использовать эту библиотеку? По сути там реализовано как раз то что вы описали. Ведь удобная же, да?)

значительно проираете, я по первости тоже пробовал использовать BulkLoader, лажа полная...

тоже самое пишешь самостоятельно ток без всякой кривоты

Zebestov 23.12.2009 13:43

Код AS3:

private function loadXML():void
{
        var ldr1:URLLoader = new URLLoader(new URLRequest("http://www.domain.com/data1.xml"));
        ldr1.addEventListener(Event.COMPLETE, onXMLComplete);
        var ldr2:URLLoader = new URLLoader(new URLRequest("http://www.domain.com/data2.xml"));
        ldr2.addEventListener(Event.COMPLETE, onXMLComplete);
        var ldr3:URLLoader = new URLLoader(new URLRequest("http://www.domain.com/data3.xml"));
        ldr3.addEventListener(Event.COMPLETE, onXMLComplete);
}
private function onXMLComplete(e:Event):void
{
        e.target.removeEventListener(Event.COMPLETE, onXMLComplete);
        this._XMLHolder.push(XML((e.target as URLLoader).data));
        if (this._XMLHolder.length == 3) this.parseXML();
}
private function parseXML():void
{
        var tree:XML;
        for each (tree in this._XMLHolder)
        {
                switch (tree[0].name().toString()) {
                        case "data1":
                                this.holdData1(tree);
                                break;
                        case "data2":
                                this.holdData2(tree);
                                break;
                        case "data3":
                                this.holdData3(tree);
                                break;
                }
        }
}

Ну как-то так. В моем случае я точно знаю, что гружу 3 XML-документа, и их надо парсить по-разному.

proxiServer 23.12.2009 16:26

silin Спасибо. Понял каких знаний не хватало.

Код AS3:

                        var parser:Function = _map[evnt.target];
                        parser(data);

Это же classFactory легко можно сделать, мне как раз нужно. Самое смешное, что читал про это даже. Но видимо пока в деле фичу не увидишь...

random13 А что конкретно было не так? Я вроде как обучаюсь флешу. Хочется выбрать один вариант и уже спокойно пользовать и не переучиваться. Но уж больно подкупает бульк простотой. Хотя и самому подгружать не большая проблема, как мне уже показали, но все-таки. По различным вариациям запроса "bulk-loader недостатки" ничего не нашел. В чем проигрываем? Память, скорость, функциональность?

Zebestov Угу, понял все, кроме старта загрузки. URLLoader в конструкторе начинает загрузку?

Zebestov 23.12.2009 18:43

Цитата:

Сообщение от proxiServer (Сообщение 874578)
URLLoader в конструкторе начинает загрузку?

ага

конечно задротней сначала вешать обработчик на процессы, прежде чем запускать их =) но не в данном случае. хотя с моим максимализмом я удивлен как это я не сделал все через load() 0o

random13 23.12.2009 22:19

Цитата:

Сообщение от proxiServer (Сообщение 874578)
silin Спасибо. Понял каких знаний не хватало.

Код AS3:

                        var parser:Function = _map[evnt.target];
                        parser(data);

Это же classFactory легко можно сделать, мне как раз нужно. Самое смешное, что читал про это даже. Но видимо пока в деле фичу не увидишь...

random13 А что конкретно было не так? Я вроде как обучаюсь флешу. Хочется выбрать один вариант и уже спокойно пользовать и не переучиваться. Но уж больно подкупает бульк простотой. Хотя и самому подгружать не большая проблема, как мне уже показали, но все-таки. По различным вариациям запроса "bulk-loader недостатки" ничего не нашел. В чем проигрываем? Память, скорость, функциональность?

Zebestov Угу, понял все, кроме старта загрузки. URLLoader в конструкторе начинает загрузку?


его простота как то невнятно работает, прибавляет уж не помню точно, помойму около 10k веса и ничего хорошего, то же самое выполняет пара методов описанных выше..

proxiServer 24.12.2009 10:36

random13 У меня приложение уже больше двух мегабайт. Для банера я конечно эту либу не буду использовать, но для флешек весом больше 100кб можно наверное)

Zebestov
from help.adobe
Цитата:

Операция загрузки может начаться сразу же, если таковое указано (дополнительные сведения см. в разделе о load).
Что-то я не нашел там про, как таковое указать.


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

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