Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > noName

Оценить эту запись

Глобальный бродкастер

Запись от silin размещена 04.07.2009 в 20:50
Обновил(-а) silin 04.07.2009 в 22:23

просто обертка для статического eventDispatcher'а

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

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

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

3. возможность блокировать/разблокировать рассылку событий определенного типа (или вообще всех), к примеру не надо мне, чтобы в какой-то момент срабатывали триггеры свойств модели, ну и пожалуйста: блокируем не угодные рассылки, когда надо будет включим снова.

минусы:
каких-то граблей в таком решении я пока не вижу, хотя и не слишком обольщаюсь, что их вовсе нет

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

реализация:
Код AS3:
package  silin.utils
{
	import flash.events.*;
 
	/**
	 * Broadcaster <br/>
	 * статический диспатчер для глобального вещания событий
	 * 
	 * @author silin
	 */
	public class Broadcaster 
	{
		public static const ALL_EVENTS:String = "*";
		private static const _DISPATCHER : EventDispatcher = new EventDispatcher();
		private static var _permittances:Object = { };
 
		/**
		 * there's no constructor
		 */
		public function Broadcaster() 
		{
			trace("Broadcaster is a static class and should not be instantiated.");
		}
 
		/**
		 * рассылает событие 
		 * @param	event		рассылаемое событие
		 * @return 				true если событие разослано
		 */
		public static function broadcastEvent(event:Event):Boolean
		{
			return _permittances[event.type] ?  _DISPATCHER.dispatchEvent(event) : false;
		}
 
		/**
		 * добавляет литенер в список глобального вещания
		 * @param	type				тип события
		 * @param	listener			метод, обрабатывающий событие
		 * @param	priority			приоритет листенера 
		 * @param	useWeakReference	использовать ли мягкие ссылки
		 */
		public static function addEventListener(type:String, listener:Function,  
								priority:int = 0, useWeakReference:Boolean = false): void
		{
			_permittances[type] = true;
			//useCapture  всегда false
			_DISPATCHER.addEventListener(type, listener, false, priority, useWeakReference);
		}
 
		/**
		 * удаляет листенер их списка глобального вещания
		 * @param	type			тип события
		 * @param	listener		удаляемый листенер
		 */
		public static function removeEventListener(type:String, listener:Function): void
		{
			_DISPATCHER.removeEventListener(type, listener, false);
			if (!hasEventListener(type))
			{
				delete _permittances[type];
			}
		}
 
		/**
		 * проверяет есть ли листенеры указанного типа
		 * @param	type		тип события
		 * @return				true, если есть листенеры, слушающие такой тип
		 */
		public static function hasEventListener(type:String): Boolean
		{
			return _DISPATCHER.hasEventListener(type);
		}
 
		/**
		 * блокирует расссылку событий указанного типа
		 * @param	type	тип события
		 */
		public static function lock(type:String=ALL_EVENTS):void
		{
			if (type == ALL_EVENTS)
			{
				for (var key:String in _permittances)
				{
					_permittances[key] = false;
				}
			}else
			{
				_permittances[type] = false;
			}
		}
 
		/**
		 * разблокирует расссылку событий указанного типа
		 * @param	type	тип события
		 */
		public static function unlock(type:String=ALL_EVENTS):void
		{
			if (type == ALL_EVENTS)
			{
				for (var key:String in _permittances)
				{
					_permittances[key] = true;
				}
			}else
			{
				_permittances[type] = true;
			}
 
		}
 
	}
 
}
Размещено в AS3
Комментарии 16 Отправить другу ссылку на эту запись
Всего комментариев 16

Комментарии

Старый 07.07.2009 19:27 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Посмотри, как это в MATE сделано Смотри, можно ж в качестве глобального диспатчера использовать уже готовый диспатчер, мало того, слушающий всплывающие события тоже.
Старый 07.07.2009 23:09 silin вне форума
silin
 
Аватар для silin
дада, я вобщем-то щупал-смотрел готовые фрейворки, но, видимо, не дорос до понимания удобств таких решений, или задачи не такого масштаба..

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

ЗЫ: если кому очевидны грабли/неудобства такого решения, не сочтите за труд, ткните носом
Старый 08.07.2009 14:03 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
А, вобщем там сделано примерно так:
в предыдущих версиях Application.application (он же по сути root для флексового приложения), а для четвертого флекса - ApplicationGlobal.application - используется в качестве такого вот диспатчера. Т.е. цель по-сути та же, но есть и бонус в том, что всплывающие события тоже попадут в этот диспатчер, и, соответственно, если кто-то диспатчит всплывающее событие, но в таком месте, где слушатель не может его получить (другая ветка дисплей листа, например), то такой диспатчер поможет получить и эти события.
Старый 25.10.2009 11:51 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
А работать как?
Код:
Broadcaster.addEventListener("event", onEvent);
Broadcaster.dispatchEvent //how?

private function onEvent(e:Event):void{
}
UPD: а, туплю, broadcastEvent есть

в целом забавная хрень, утащу наверно в свою сборку фреймворков
Спасибо.
Старый 25.10.2009 12:07 silin вне форума
silin
 
Аватар для silin
ага, согласен dispatchEvent здесь уместнее, чем broadcastEvent
сам не пойму теперь почему так обозвал
Старый 25.10.2009 17:33 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Забрал себе
Поменял
Код AS3:
import flash.events.*;
на
Код AS3:
import flash.events.Event;
import flash.events.EventDispatcher;
т.к. компилится быстрее, и тебе советую.
Ещё раз спасибо, твой класс мне щас задницу спас
Старый 27.10.2009 12:23 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
т.к. компилится быстрее, и тебе советую.
На сколько быстрее?
Старый 27.10.2009 19:15 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
чуть больше, чем на микрон

На самом деле, разницы для компилирующих флекс сдк ноль.
Для компилирующих через флеш иде - она весьма ощутима.
Обновил(-а) Psycho Tiger 27.10.2009 в 19:21
Старый 27.10.2009 21:09 silin вне форума
silin
 
Аватар для silin
Тигр, ты давно тут видел людей, компилирующих через флеш иде ?
пусть уж все останутся при своих предпочтениях в организации импортов
мне лично очень по душе новая (не осознал в какой версии появилась) фича FD
Refactor-Truncate Imports
а еще AutoFormat / Indent Plugin косит неиспользуемые импорты - мелочь, а как душевно
Старый 28.10.2009 20:48 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Ну, например у меня в универе на машинах стоят флеш идехи, а флексовых нету
пожалуй, насчет предпочтений - ты прав, оставим всё как есть.)
Старый 29.10.2009 13:34 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Refactor-Truncate Imports
Это где такое?
Старый 01.11.2009 20:34 silin вне форума
silin
 
Аватар для silin
FD3.0.5
правая кнопка - Refactor..
Старый 02.11.2009 13:22 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
FD3.0.5
правая кнопка - Refactor..
Ничего нет подобного. Может речь о плагине? Я его ставил, но он у меня не работает.
Старый 02.11.2009 20:57 silin вне форума
silin
 
Аватар для silin
не, плагин мне тоже не пошел
речь о встроенной фиче, кстати в той же ветке в самом конце Мика о ней упоминает

Старый 02.11.2009 23:15 iNils вне форума
iNils
 
Аватар для iNils
Так там говорится о наличии этой фичи в рабочей сборке, а в релиз этого видимо не попало, тк у меня этого нет.
Старый 03.11.2009 01:12 silin вне форума
silin
 
Аватар для silin
ага, но у меня сейчас тоже стоит 3.0.5 RTM, но ставил поверх того что было (а были и промежуточные сборки), может в этом фокус
 
Последние записи от silin

 


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


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