Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   О классах и методах и немного про URLLoader (http://www.flasher.ru/forum/showthread.php?t=129532)

Gava 03.09.2009 18:10

О классах и методах и немного про URLLoader
 
Доброго времени суток.
Совсем уже отчаялся и решил-таки спросить.

Задача сводится к стандартной загрузке XML документа.
Итак дано:

есть два класса loadData и createObj

loadData - клас осуществляющий загрузку XML. Код привожу в кратце:

Код AS3:

var loadXMLdata:XML;
var loader:URLLoader = new URLLoader(new URLRequest("xml.xml"));
loader.addEventListener(Event.COMPLETE, getDataXML);
function getDataXML(e:Event):void
        {
                loadXMLdata = XML(e.target.data);
        }

второй класс createObj имеет лишь одну цель, а именно получить вот эту самую loadXMLdata из loadData и на этих данных уже сформировать экземпляр в конструкторе.

в принципе с задачей в плане кода я справился как мне кажется, но наткнулся на проблему которая уже имела место быть на форуме, но ответа я так и не нашел.
А именно - когда я обращаюсь как угодно к loadData толи через создание экземпляра, толи через прямое обращение к функции - я просто не успеваю загрузить данные в переменную.Ну и формирование экземпляра createObj соответсвенно летит в тар-тарары.
Как притормозить выполнение кода я так и не придумал.

Так вот в чем вопрос. Такой вариант реализации вообще имеет право на существование? Если нет то какие есть варианты? Для меня критично именно продолжение кода уже с загруженными данными. Затормозить ожиданием функции тоже нельзя, т.к. конструктор свои дела закрывает и все значения у меня null.

Ну всем кто уделит мне пару строк за ранее спасибо:)

evg1605 03.09.2009 19:01

Я правильно понял что loadData ты используешь следующим образом
Код AS3:

var ld:loadData = new loadData();
//и сразу же второй строчкой
createObj.use(ld);

Если так , то ты разумеется не дожидаешься загрузки.
createObj должен юзать loadData, только когда она ему просигналит :)
(т.е. подписавшись на событие), а событие должно генерироваться loadData сразу после строчки loadXMLdata = XML(e.target.data);
Если не правильно понял - напиши подробнее код.

amesqit 03.09.2009 19:07

А что мешает после получения в классе loadData сгенерировать событие, подписаться на него там где это необходимо и после вызова события сгенерированного в loadData создать экзепляр createObj на основе данных в loadXMLdata? Все что для этого надо почитать в хелпе про класс EventDispatcher и его метод dispatchEvent()

evg1605 03.09.2009 19:10

Ну так я за то и агитирую :)

Idon 03.09.2009 19:14

1)
Код AS3:

function getDataXML(e:Event):void
        {
                loadXMLdata = XML(e.target.data);
 
              //а вот тут нельзя создать экземпляр createObj?
 
        }

2)
Можно прямо в createObj загружать xml, но технология там будет такая же: "событие окончания загрузки->всё остальное".

3) Можно перед вызовом конструктора createObj проверять, завершилась ли загрузка, и если нет не создавать createObj (если его создание не критично или пользователь может самостоятельно генерировать попытки его создания. например по нажатию на кнопку).

4) не уверен, что получится, но можно попробовать написать супер-корявый код:
сделать бесконечный цикл, выходом из которого будет событие окончания загрузки.
(допустим, в цикле можно проверять переменную, которая после окончания загрузки меняется на то значение, которое удовлетворяет выходу из бесконечного цикла). Но даже если это и заработает, тут есть подводные камни: защита флеша от зацикливания (по-умолчанию, там вроде 15 сек дается), ситуация, когда загрузка не происходит. Плюс ко всему, я бы постеснялся писать такое))

amesqit 03.09.2009 19:20

Idon, особо нет смысла мешать в кучу загрузку и обработку данных, бесконечный цикл, нажатие на кнопку не выход, это глупо, если будет долго загружаться, то юзер замучается жать кнопку, а цикл будет ограничиваться 15 секундами, да и зачем изобретать велосипед, когда элементарно можно воспользоваться пользовательскими событиями, они для того и предназначены
P.S.: в варианте 4 загрузка xml не произойдет никогда, т.к. до завершения цикла другой код выполняться не будет, в том числе и обработка загрузки xml

evg1605 03.09.2009 19:21

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

СлаваRa 03.09.2009 19:23

а вы перед XML не пробовали поставить new?

amesqit 03.09.2009 19:37

Цитата:

Сообщение от СлаваRa (Сообщение 848016)
а вы перед XML не пробовали поставить new?

тут идет преобразование типов, можете сами попробовать:

Код AS3:

var xml:XML = XML("<a><b><c/></b></a>")
trace(xml)

или
Код AS3:

var xml:XML =XML(<a><b><c/></b></a>)
trace(xml)


СлаваRa 03.09.2009 19:42

покажи весь код класса


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

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