PDA

Просмотр полной версии : Определить наличие слушателя.


Fogflasher
31.12.2013, 11:49
Всем привет, и с Наступающим.

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

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

alatar
31.12.2013, 12:08
Вы можете определить факт наличия слушателя для определенного типа событий (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/events/EventDispatcher.html#hasEventListener()).
И как следствие, получить список всех слушателей, привязанных к объекту?
Список получить не получится.

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
Не совсем понимаю что значит "обертка", это интерфейсы?
Если я правильно понимаю, то приблизительно так, как в коде, который я как то раз подсмотрел -
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
Wolsh, Объект должен отписываться от тех, кого слушает, а не отписывать тех, кто слушает его.
О как, не знал про этот принцип, поapply'ю его, но таки уже не сегодня ^_^


Akopalipsis,
30304