Зачем использовать IEventDispatcher.hasListener ()? - PullRequest
1 голос
/ 16 ноября 2010

Мне интересно узнать о преимуществах производительности при использовании hasEventListener () по сравнению со слепой отправкой события?

Например, я вижу в фрагментах кода платформы Flex, таких как:

// from ArrayList.setItemAt()
var hasCollectionListener:Boolean = hasEventListener(CollectionEvent.COLLECTION_CHANGE);
if (hasCollectionListener)
{
     dispatchEvent(new CollectionEvent(....))
}

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

Однако это не 'Кажется, это имеет смысл.

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

Поэтому, зачем беспокоиться о проверке, а не просто слепо вызывать метод dispatchEvent?Исходный пример кода значительно неуклюже, чем если бы они только что отправили событие.

С уважением,

Марти

Ответы [ 3 ]

1 голос
/ 17 ноября 2010

Отправка событий, даже если не зарегистрированы прослушиватели событий, может повлиять на производительность вашего приложения. Поэтому использование hasEventListener() считается наилучшей практикой.

На багтрекере Adobe идет длинная дискуссия на эту тему: http://bugs.adobe.com/jira/browse/SDK-24249

В двух словах: когда вы пишете dispatchEvent(new Event("foo")), создается новый объект типа Event и отправляется событие. В конечном итоге GC приходит и удаляет объект события из памяти. Вы не заметите никакой разницы в ситуациях, когда событие происходит только несколько раз. В случае привязок или других событий, которые отправляются в большом количестве, использование hasEventListener() может иметь значение.

Начиная с Flex 4 код, сгенерированный компилятором при использовании [Bindable], всегда использует hasEventListener() перед отправкой события.

0 голосов
/ 16 ноября 2010

Делает ли метод приема вызов Event.stopPropagation () или Event.stopImmediatePropagation ()?

Я вижу, что они захотят проверить, был ли там прослушиватель событий, если они не хотят, чтобы он передавался другим слушателям в приложении. Если бы слушателя там не было, он не смог бы предотвратить распространение, пока не испортит что-то еще, например, другой компонент того же типа!

0 голосов
/ 16 ноября 2010

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

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

Однако для вызова hasEventListener есть несколько применений. Примерно так будет иметь смысл:

if(hasEventListener("HeavyComputationChanged")) {
    doSomeHeavyComputation();
    dispatchEvent("HeavyComputationChanged");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...