2011-01-21 4 views
0

Я изучаю как3, и у меня возникают трудности с пониманием событий.Немного помогите разобраться в событиях (вопрос о нобе)

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

Теперь ..

private function init(e:Event = null):void { 

    removeEventListener(Event.ADDED_TO_STAGE, init); 

    myLoader.load(new URLRequest("slides.xml")); 
    myLoader.addEventListener(Event.COMPLETE, processXMLSlides); 
    ... 
} 

private function processXMLSlides(e:Event):void { 

    removeEventListener(Event.COMPLETE, processXMLSlides); 

    myXML = new XML(e.target.data); 
    myXML.ignoreWhite=true; 

    for (var i:int = 0; i < myXML.IMAGE.length(); i++) { 
     imagesURLs.push(myXML.IMAGE[i]); 
     //trace(myXML.IMAGE[i]); 
    } 
    //Start the main routine. 
    loadImages(); 
    writeImage(imageCurrent); 
} 

loadImages() принимает imagesURLs массива и загружает их в другой массив как URLRequests, а затем writeImage() записывает изображение на сцену.

Теперь дело в этом. Функция Если я перенесу loadImages() и writeImage() здесь:

private function init(e:Event = null):void { 

     removeEventListener(Event.ADDED_TO_STAGE, init); 

     myLoader.load(new URLRequest("slides.xml")); 
     myLoader.addEventListener(Event.COMPLETE, processXMLSlides); 

      //Start the main routine. 
     loadImages(); 
     writeImage(imageCurrent); 
     ... 
    } 

Это не работает, потому что loadImages вызывается ДО массив получает заполняется из XML. Теперь, как я могу сказать as3 ожидать завершения процессаXMLSlides? Нужно ли мне другое событие? Это глупо (есть лучшие способы делать то, что я делаю)?

Благодаря

+0

только примечание: слушатели событий должны быть удалены из своих диспетчеров. например, myLoader.removeEventListener (Event.COMPLETE, processXMLSlides) ;, evt.target.removeEventListener ... или evt.currentTarget.removeEventListener ... – TheDarkIn1978

+0

@ TheDarkIn1978 Почему вы так говорите? Вам нужно удалить eventListeners только в том случае, если есть причина, а не каждый раз. –

+0

Извините, я не был ясен. я сказал, что приведенный выше код неверен, поскольку myLoader добавляет прослушиватель событий и отправляет событие, но родительский объект myLoader пытается удалить прослушиватель событий, который он не имеет. Кроме того, прослушиватели событий должны быть удалены, если они не используются, иначе вы столкнетесь с проблемой сбора мусора. – TheDarkIn1978

ответ

2

Ваш вопрос не имеет смысла, ваш первый пример делает именно то, что вы просите - ожидание XML для загрузки.

Вспышка событий очень удобна при обработке асинхронных процессов - например, при загрузке XML - как долго вы будете ждать иначе, прежде чем звонить loadImages(); и writeImage(imageCurrent);? Ответ в точности такой, какой требуется для загрузки XML. Так что держите его там, где он есть, в методе обработчика событий.

Примечание:

Добавить слушателя myLoader первым и вызвать метод загрузки() только после этого. При тестировании в локальной среде (с жесткого диска) может случиться так, что «slides.xml» будет загружаться немедленно, и событие COMPLETE будет запущено до присоединения eventListener.

+1

Спасибо, теперь я лучше понимаю всю проблему. – 0plus1

1

это непроверенный код, но что-то, как это должно работать:

private function init(e:Event = null):void 
    { 
    removeEventListener(Event.ADDED_TO_STAGE, init); 

    myLoader.addEventListener(Event.COMPLETE, processXMLSlides); 
    myLoader.load(new URLRequest("slides.xml")); 
    } 

private function processXMLSlides(e:Event):void 
    { 
    e.currentTarget.removeEventListener(Event.COMPLETE, processXMLSlides); 

    myXML = new XML(e.target.data); 
    myXML.ignoreWhite = true; 

    for each (var element:XML in myXML..IMAGE) 
       { 
       var imageLoader:Loader = new Loader(); 
       imageLoader.addEventListener(Event.COMPLETE, writeImage); 
       imageLoader.load(new URLRequest(element)); 
       } 
    } 

private function writeImage(e:Event):void 
    { 
    e.currentTarget.removeEventListener(Event.COMPLETE, writeImage); 
    addChild(evt.currentTarget); 
    } 

вы можете придерживаться вара я: UINT для цикла, хотя, как вы могли бы использовать его для размещения размещения каждого ваших изображений.

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

Смежные вопросы