addEventListeners и лучшие практики - PullRequest
1 голос
/ 16 июля 2011

Я использую этот простой код для извлечения значения из сценария PHP:

package 
{
    import flash.display.MovieClip;
    import flash.net.URLLoader;
    import flash.net.URLVariables;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    //
    public class URLTest extends MovieClip
    {
        //
        var scriptLoader:URLLoader;
        //
        public function URLTest()
        {
            scriptLoader = new URLLoader();
            scriptLoader.addEventListener(Event.COMPLETE, handleLoadSuccessful);
            scriptLoader.addEventListener(IOErrorEvent.IO_ERROR, handleLoadError);
        }
        //;
        public function handleLoadSuccessful($evt:Event):void
        {
            trace("Message sent.");
            trace($evt.target.data);
        }
        //
        public function handleLoadError($evt:IOErrorEvent):void
        {
            trace("Message failed.");
        }
        //
        public function sendLoad(variable):void
        {
            var scriptRequest:URLRequest = new URLRequest("http://mydomain/myapp/my.php");
            var scriptVars:URLVariables = new URLVariables();

            scriptVars.var1 = variable;

            scriptRequest.method = URLRequestMethod.POST;
            scriptRequest.data = scriptVars;

            scriptLoader.load(scriptRequest);
            trace(scriptLoader);
        }

    }

}

Если вы посмотрите на конструктор URLTest, вы обнаружите, что я инициализирую прослушиватели экземпляра URLLoader.

Лучше ли объявлять метод initListeners и вызывать его каждый раз, когда я вызываю sendAndLoad?Как следствие, лучше ли было бы удалять слушателей внутри методов handleLoadError и handleLoadSuccesful?Являются ли слушатели интенсивными процессорами?

Кстати, я не понимаю, почему этот вопрос «кажется субъективным», поскольку мы говорим о выступлениях, а не о стиле программирования.

1 Ответ

0 голосов
/ 16 июля 2011

Поскольку ваш класс предназначен для возможности совершать несколько звонков на один и тот же веб-сервис, я определенно выбрал бы вариант 2. Рассмотрим следующее:

var loader:URLTest = new URLTest();
loader.sendLoad("a");
loader.sendLoad("b");

Теперь, если вы повторно используете один и тот же URLLoaderдля обоих вызовов нет способа узнать, какое событие COMPLETE будет соответствовать какому вызову.

Чтобы решить эту проблему, вы должны создать URLLoader (+ прослушиватели событий) для каждого вызова и поместить его в массив, чтобы иметь возможность его идентифицировать.Когда ответ приходит с сервера - будь то ЗАВЕРШЕНО или IOERROR - вы можете удалить прослушиватели событий и удалить идентифицированный URLLoader (тот, который соответствует event.currentTarget) из массива.

Проблема с производительностьютривиально здесь.Не будет никакого удара по производительности для создания группы слушателей событий, если вы не забудете их удалить, когда закончите с ними.В противном случае соответствующие URLLoaders не будут собираться мусором и будут накапливаться в памяти.

С другой стороны: нет абсолютно никаких причин для расширения с MovieClip.Если вы хотите, чтобы ваш класс отправлял события, просто добавьте EventDispatcher.

...