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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.04.2017, 02:39
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 1  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
По умолчанию Диспатч события, единичный вариант?

Всем привет. Вот задался таким вопросом. К примеру у нас есть класс, который загружает инфу с сервера. Создадим 6 таких классов на сцене(соответственно с разными параметрами в конструкторе). Если через for все эти классы инициализировать, они начинают загрузку, как только вызван конструктор данного класса. Вопрос заключается в следующем. Загрузка будет происходить сразу же у всех классов после их инициализации, независимо от того, была ли загружена инфа с предыдущего класса или нет, который сделал запрос на сервер. Но из представленных вариантов, мы можем просто тупо продиспатчить всё это дело и добавить слушатель к каждому экземпляру. Соответственно, что это получается, к каждому экземпляру, присваивается слушатель? То есть 6 addEventListener в моем случае. Можно прицепить один слушатель, ко всем классам, но тогда нужно задать текущее состояние загрузки, типо 0/6 1/6 2/6 и по достижению загрузки всех экзепляров, работа происходит дальше. Но я не вижу в этом удобства. Есть ли иной вариант? Например просто добавить типо
Код AS3:
var myClassLoader:MyLoader = new MyLoader();//Первый экземпляр
var myClassLoader2:MyLoader = new MyLoader();//Второй экземпляр, но конструктор вызваться должен, только после того, как был инициализирован первый класс со всем содержимым, в том числе подгрузкой извне
В Java например, myClassLoader2 не будет создан, пока всё не создаться с myClassLoader, в том числе загрузка инфы с сервера. Речь конечно может идти не только о загрузке с сервера, даже банальная загрузка из локальной папки, какого либо файла.

Старый 13.04.2017, 02:48
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 2  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
зачем тебе именно последовательная загрузка? начинать ее в конструкторе где есть какая-то еще логика, кроме самой загрузки - решенее сомнительное. почему все таки решил писать свой лоадер, а не брать готовый? если нужна цепочка загрузок, зачем делать через события, а не через хендлер onComplete?

Старый 13.04.2017, 02:51
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 3  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
faraday
Цитата:
зачем тебе именно последовательная загрузка?
К примеру я загружаю картинку, мне нужно эту картинку клонировать несколько раз, но клонировать я ее смогу, только после её загрузки. А если таких картинок 20 или 50 имеется ввиду разных?
Цитата:
зачем делать через события, а не через хендлер onComplete?
Хотелось бы избавиться от хендлеров в этом случае вообще.

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


Последний раз редактировалось Godwarlock; 13.04.2017 в 03:08.
Старый 13.04.2017, 03:19
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 4  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
если решать задачу в лоб, то меняй события, на методы инициализации класса, с ними работать проще

Код AS3:
public function init(handler:Function):void{
  //loading..
  handler();
}
дальше задаешь последовательность
Код AS3:
var queue:Array=[myClassLoader.init, myClassLoader2.init,...]
и отправляешь ее в функцию параллельного вызова
Код AS3:
function listCall(handlers, cb){
	var queue=handlers.length;
	handlers.forEach(function(handler) {
		handler(function(){
			if (--queue==0)
				cb&&cb()
		})
	});
}
или последовательного
Код AS3:
function chainCall(handlers, cb){
	var handler=handlers.shift();
	if (!handler)
		return cb&&cb();
	handler(function(){
		chain(handlers, cb)
	})
}
Типа таких, писал по-памяти. Но 100% что сама проблема у тебя в архитектуре, и решение такое тут не лучшее

Старый 13.04.2017, 03:37
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 5  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Хм. Ну да, вариант выглядит не очень красиво, массивы создавать с функциями, это аналогично созданию хранилища для необходимых объектов и отправлять их в один загрузчик на загрузку и подписать на загрузку всех данных из массива, один комплит хэндлер, после которого уже идет работа с данными, которые нужны в данный момент, ну и соответственно все эти данные куда-нибудь поместить, чтобы дергать оттуда и повторно не прогружать. Просто думал, может есть варианты, без лишних хэндлеров при помощи дефолтных методов as3

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

Старый 17.04.2017, 23:31
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 6  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
В отличии от Java, нет возможности взаимодействовать с чем то синхронно (кроме FileStream, ExternalInterface.call), это сделано оправданно так как все вызовы выполняются в Main потоке и Flash заставляет этот Main поток разгружать событийной моделью.
В архитектурном плане обработка последовательности решается просто, нужно сделать некую абстракцию вида Task/Job/Runnable как Java мире
__________________
RocketJump

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:21.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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