Форум 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=214100)

Godwarlock 13.04.2017 02:39

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

var myClassLoader:MyLoader = new MyLoader();//Первый экземпляр
var myClassLoader2:MyLoader = new MyLoader();//Второй экземпляр, но конструктор вызваться должен, только после того, как был инициализирован первый класс со всем содержимым, в том числе подгрузкой извне

В Java например, myClassLoader2 не будет создан, пока всё не создаться с myClassLoader, в том числе загрузка инфы с сервера. Речь конечно может идти не только о загрузке с сервера, даже банальная загрузка из локальной папки, какого либо файла.

faraday 13.04.2017 02:48

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

Godwarlock 13.04.2017 02:51

faraday
Цитата:

зачем тебе именно последовательная загрузка?
К примеру я загружаю картинку, мне нужно эту картинку клонировать несколько раз, но клонировать я ее смогу, только после её загрузки. А если таких картинок 20 или 50 имеется ввиду разных?
Цитата:

зачем делать через события, а не через хендлер onComplete?
Хотелось бы избавиться от хендлеров в этом случае вообще.

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

faraday 13.04.2017 03:19

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

Код 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% что сама проблема у тебя в архитектуре, и решение такое тут не лучшее

Godwarlock 13.04.2017 03:37

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

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

Nooob 17.04.2017 23:31

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


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

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