Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Определить наличие слушателя. (http://www.flasher.ru/forum/showthread.php?t=205923)

Fogflasher 31.12.2013 11:49

Определить наличие слушателя.
 
Всем привет, и с Наступающим.

Вопрос общего плана: можно ли определить висит ли на данном объекте слушатель?
И как следствие, получить список всех слушателей, привязанных к объекту?

Подозреваю, что это невозможно. Но что делать, если возникла такая задача?
Например, архитектура такова, что нужно удалить слушатель, но не факт, что этого уже не произошло.
Проще всего наверное оставить его для GC. Ну или менять архитектуру, упрощать, прояснять.

alatar 31.12.2013 12:08

Вы можете определить факт наличия слушателя для определенного типа событий.
Цитата:

И как следствие, получить список всех слушателей, привязанных к объекту?
Список получить не получится.

caseyryan 31.12.2013 12:10

Можно смело удалять слушатель. Если он уже удален, то ничего не произойдет. А проверить список слушателей стандартными средствами невозможно. Если нужно, то можно написать обертку над Sprite, к примеру, и там регистрировать наличие всех слушателей. Но я бы так делать не стал.

Wolsh 31.12.2013 12:29

Непонятно, зачем оно надо.
Цитата:

Например, архитектура такова, что нужно удалить слушатель, но не факт, что этого уже не произошло.
И? Исключения то не будет, это не removeChild().

Fogflasher 31.12.2013 12:33

Цитата:

Список получить не получится.
В общем понятно, спасибо. Значит только флажок наличия можно получить.

Цитата:

можно написать обертку над Sprite
Не совсем понимаю что значит "обертка", это интерфейсы?

Цитата:

Но я бы так делать не стал.
А почему кстати? Видимо, нет особого смысла.

Цитата:

И? Исключения то не будет, это не removeChildren().
Мне кажется, у меня были проблемы с удалением несуществующего слушателя.
Но точно не уверен, много экспериментировал, может быть что-то не так проинтерпретировал.

Wolsh 31.12.2013 13:01

Цитата:

Не совсем понимаю что значит "обертка", это интерфейсы?
Нет, это переопределение (override) методов addEventListener и removeEventListener в Вашем классе-наследнике спрайта. Заводите справочник например (Dictionary) и записываете в него всех желающих добавиться в слушатели прямо в переопределенном addEventListener. Затем выполняете super.addEventListener(), то есть "обычный"))) Так же с удалением.
Но, еще раз, в этом нет никакого смысла. Время от времени такой вопрос задают, но почти всегда это связано с неправильным пониманием "очищения объекта перед удалением из памяти". Объект должен отписываться от тех, кого слушает, а не отписывать тех, кто слушает его.

Akopalipsis 31.12.2013 13:53

Цитата:

Не совсем понимаю что значит "обертка", это интерфейсы?
Если я правильно понимаю, то приблизительно так, как в коде, который я как то раз подсмотрел -
Код AS3:

override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
{
        _listeners.push( { type:type, listener:listener } );
        super.addEventListener(type, listener, useCapture, priority, useWeakReference);
}
 
public function destroyEventListener():void
{
        var length:int = _listeners.length;
        for (var i:int = 0; i < length; i++)
        {
                var type:String = _listeners[i].type;
                var listener:Function = _listeners[i].listener;
                this.removeEventListener(type, listener);
        }
        _listeners.length = 0;
}

Всех с наступающим!

caseyryan 31.12.2013 14:12

да, все верно

Fogflasher 31.12.2013 23:52

Вложений: 1
Wolsh,
Цитата:

Объект должен отписываться от тех, кого слушает, а не отписывать тех, кто слушает его.
О как, не знал про этот принцип, поapply'ю его, но таки уже не сегодня ^_^


Akopalipsis,
Вложение 30304


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

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