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

inMashine 20.08.2010 12:23

Как контролировать очередность загрузки?
 
Допустим у нас есть два swf ролика, которые надо загрузить (сначало первый, потом второй).
Создаем для каждого лоадер и к каждому лоадеру прикрепляем слушатель COMPLITE.
Но если первый ролик тяжелее второго, тогда событие COMPLETE для второго ролика сработает раньше, чем для первого.
Как можно контролировать эту очередность?

Wolsh 20.08.2010 13:14

Ну так и загружайте сначала первый, а уже ПОТОМ второй. Для чего Вам события то даны? Как раз для того чтобы знать, что "первый ролик загрузился" и можно начинать загрузку второго.

inMashine 20.08.2010 13:45

Как я могу узнать, что загрузился первый?
Я могу только видеть что запустилась функция, предписанная выполнится после загрузки первого или второго клипа.
Первая функция выполняется после загрузки первого клипа. Вторая - после загрузки второго.
Но так как второй клип загружается раньше, то первой выполняется вторая функция.

cauchy 20.08.2010 13:51

secondSWF.load() запускай в обработчике COMPLETE для первого SWF

inMashine 20.08.2010 13:57

А если swf файлов 20 штук или что еще хуже - неизвестное заранее кол-во?

Bgg 20.08.2010 14:02

Цитата:

Сообщение от inMashine (Сообщение 930143)
Как я могу узнать, что загрузился первый?
Я могу только видеть что запустилась функция, предписанная выполнится после загрузки первого или второго клипа.
Первая функция выполняется после загрузки первого клипа. Вторая - после загрузки второго.
Но так как второй клип загружается раньше, то первой выполняется вторая функция.

Есть всего два метода: один инициализирует загрузку, другой отлавливает событие окончания загрузки. А ещё массив аля:
Код AS3:

[["path2swf1", false],["path2swf2", false], ...]

Где path2swf1 - путь к первой swf, а false - показатель загружали вы первый swf файл или нет. При загрузке первой swf выставляете true в первом методе, а при окончании загрузки во втором методе ищете в массиве элементы с false и опять запускаете первый метод. Как только все элементы будут с true, то загрузка завершена.

RomECH 20.08.2010 14:19

создаем array из путей к файлам: ["http://...","http://...",...] создаем request, loader и функцию, которая меняет задание рекуэста на следующий элемент массива и дает задание загрузить снова.

Wolsh 21.08.2010 01:41

Ну да, есть параллельная загрузка с проверкой "все ли загрузилось".
Есть так же последовательная загрузка, когда каждый следующий элемент грузится только после окончания загрузки предыдущего, и есть их "симбиоз", когда элементы грузятся потоками, например одновременно в процессе находятся три параллельных загрузки, менеджер потоков следит за каждым отдельно и распределяет оставшиеся элементы по потокам (а фактически просто отдает следующий элемент массива освободившемуся лоадеру, помечая его как "в процессе", а по окончании загрузки - как "загруженный").
inMashine, не может быть "неизвестно заранее". В любом случае есть массив адресов, которые грузить - неважно, каким образом полученный, допустим из XML файла. Назовем его _loaderQueue. Создаем также массив, в который будем складывать загруженный контент (например Битмапы), назовем его _images. Делаем рекурсию из двух функций, и вперед
Код AS3:

private function loadIcon(url:String):void
{
        _iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, nextQueue);
        _iconLoader.load(new URLRequest(url));
}
 
private function nextQueue(event:Event):void
{
        _images.push(event.target.content as Bitmap);
        if (_images.length < _loaderQueue.length)
        {
                loadIcon(_loaderQueue[_images.length]);
        }
        else
        {
                dispatchEvent(new Event(Event.COMPLETE));
        }
}
// стартуем загрузку (где-то в другом методе этого класса)
...  loadIcon(_loaderQueue[0]);  ...


inMashine 22.08.2010 01:57

Пасибо всем.

To RomECH:
Если вы попробуете сделать свой класс по шаблону, коорый вы предложили, то сталкнетесь с проблемой, описанной мною в первом посте.

Идея с двумерным массивом - это единственно возможный вариант на мой взгляд. ( хотя наверное существуют и более хитрые решения ).

To Wolsh:

Не могли бы вы написать к кому в вашем примере нужно прикреплять слушатель этого события:
Код AS3:

dispatchEvent(new Event(Event.COMPLETE));


Wolsh 22.08.2010 12:06

Если этот код - в отдельном классе, то к экземпляру этого класса. А если Вы пытаетесь написать весь код в одном кадре таймлайна, то и нет особого смысла диспатчить событие - можно запустить нужный метод напрямую. Смысл в том, что в этом месте вся загрузка очереди закончилась, теперь делайте что хотите. Это же шаблонный код просто для примера, костяк так сказать, а мясо наращивать Вам.
Ну вот смотрите (немного ООП):
Допустим у Вас что-то типа фотогалереи. Флэшка загружается в клиент и запрашивает список фотографий на сервере. Получает xml-файл, парсит его и создает массив - список адресов картинок (массив может быть многомерный и содержать дополнительную инфу по картинкам, мы это не трогаем сейчас). В принципе это - отдельный блок задач, и вполне уместно сделать отдельный Объект в понятии ООП - Класс XMLLoader. Его экземпляр загрузит и распарсит xml-ку, подготовит данные для загрузки (и информационного сопровождения) картинок. Закончив, он диспатчит событие "список готов". У Вас в коде основного класса есть подписка на это событие от этого экземпляра XMLLoader'а, выполняется метод, запускающий загрузку изображений. В этом методе Вы создаете экземпляр другого Объекта - Класса ImageLoader, и подписываетесь на событие COMPLETE от него. Отдаете ему список адресов и говорите "грузи". Экземпляр загружает все изображения как описано в предыдущем посте, складывает их в какое-то хранилище с открытым доступом и диспатчит событие COMPLETE. Основной класс получает это событие и запускает обработчик, вызывающий уже дальнейшие действия по демонстрации этих изображений.
Для того и нужны классы, что они представляют из себя логические блоки, делающие какую-то определенную работу (специализация). Другим классам не надо ничего знать о их способах работы и устройстве (инкапсуляция). В этом простейшем примере есть Основной класс Main, который руководит парадом, он как штаб - получает сводки о происходящем и на сновании событий отдает приказы.
- Загрузить xml-ку!
(проходит время)
- "xml-ка загружена!" (XMLLoader.COMPLETE)
- Загрузить картинки из списка xml!
(проходит время)
- "Картинки загружены!" (ImageLoader.COMPLETE)
- Показать загруженные картинки!
Ни один из этих классов понятия не имеет, что происходит "внутри" другого. Каждый выполняет свою работу, и, закончив, отчитывается штабу Main. Main "забирает" результат (обычно доступ к нему организуется через геттер data, т.е. для Main, получившего событие event - event.target.data) и поручает его следующему батальону со специальным назначением.
Надеюсь я ответил на Ваш вопрос..)))

inMashine 22.08.2010 17:15

Все понял.
Один вопрос, если не возражаете.
По поводу геттер data: вот такую ошибку выдает:
Код AS3:

ReferenceError: Error #1069: Property data not found on LoadPictures and there is no default value.

LoadPictures - это мой класс. В нем что надо прописывать вручную метод data, что бы был доступен геттер data?
Если да - то как это сделать?

Wolsh 22.08.2010 17:56

Ну а как же. Конечно вручную. Это ведь ВАШ класс, мало ли какие у него задачи и какой тип данных возвращает этот геттер - строку? масссив? XML?
Код AS3:

private var _imagesArray:Array;
// где-то мы заполнили массив ссылками на загруженные изображения
// и разослали событие - картинки готовы к использованию
// геттер позволит хендлеру события обратиться к этому массиву
public function get data():Array
{
    return _imagesArray;
}


inMashine 22.08.2010 18:10

Теперь понятно.
Спасибо.

MrPoma 22.08.2010 18:23

Вложений: 1
Есть уже написанная штука, которая даже работает :-)


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

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