![]() |
Как контролировать очередность загрузки?
Допустим у нас есть два swf ролика, которые надо загрузить (сначало первый, потом второй).
Создаем для каждого лоадер и к каждому лоадеру прикрепляем слушатель COMPLITE. Но если первый ролик тяжелее второго, тогда событие COMPLETE для второго ролика сработает раньше, чем для первого. Как можно контролировать эту очередность? |
Ну так и загружайте сначала первый, а уже ПОТОМ второй. Для чего Вам события то даны? Как раз для того чтобы знать, что "первый ролик загрузился" и можно начинать загрузку второго.
|
Как я могу узнать, что загрузился первый?
Я могу только видеть что запустилась функция, предписанная выполнится после загрузки первого или второго клипа. Первая функция выполняется после загрузки первого клипа. Вторая - после загрузки второго. Но так как второй клип загружается раньше, то первой выполняется вторая функция. |
secondSWF.load() запускай в обработчике COMPLETE для первого SWF
|
А если swf файлов 20 штук или что еще хуже - неизвестное заранее кол-во?
|
Цитата:
Код AS3:
|
создаем array из путей к файлам: ["http://...","http://...",...] создаем request, loader и функцию, которая меняет задание рекуэста на следующий элемент массива и дает задание загрузить снова.
|
Ну да, есть параллельная загрузка с проверкой "все ли загрузилось".
Есть так же последовательная загрузка, когда каждый следующий элемент грузится только после окончания загрузки предыдущего, и есть их "симбиоз", когда элементы грузятся потоками, например одновременно в процессе находятся три параллельных загрузки, менеджер потоков следит за каждым отдельно и распределяет оставшиеся элементы по потокам (а фактически просто отдает следующий элемент массива освободившемуся лоадеру, помечая его как "в процессе", а по окончании загрузки - как "загруженный"). inMashine, не может быть "неизвестно заранее". В любом случае есть массив адресов, которые грузить - неважно, каким образом полученный, допустим из XML файла. Назовем его _loaderQueue. Создаем также массив, в который будем складывать загруженный контент (например Битмапы), назовем его _images. Делаем рекурсию из двух функций, и вперед Код AS3:
|
Пасибо всем.
To RomECH: Если вы попробуете сделать свой класс по шаблону, коорый вы предложили, то сталкнетесь с проблемой, описанной мною в первом посте. Идея с двумерным массивом - это единственно возможный вариант на мой взгляд. ( хотя наверное существуют и более хитрые решения ). To Wolsh: Не могли бы вы написать к кому в вашем примере нужно прикреплять слушатель этого события: Код AS3:
|
Если этот код - в отдельном классе, то к экземпляру этого класса. А если Вы пытаетесь написать весь код в одном кадре таймлайна, то и нет особого смысла диспатчить событие - можно запустить нужный метод напрямую. Смысл в том, что в этом месте вся загрузка очереди закончилась, теперь делайте что хотите. Это же шаблонный код просто для примера, костяк так сказать, а мясо наращивать Вам.
Ну вот смотрите (немного ООП): Допустим у Вас что-то типа фотогалереи. Флэшка загружается в клиент и запрашивает список фотографий на сервере. Получает xml-файл, парсит его и создает массив - список адресов картинок (массив может быть многомерный и содержать дополнительную инфу по картинкам, мы это не трогаем сейчас). В принципе это - отдельный блок задач, и вполне уместно сделать отдельный Объект в понятии ООП - Класс XMLLoader. Его экземпляр загрузит и распарсит xml-ку, подготовит данные для загрузки (и информационного сопровождения) картинок. Закончив, он диспатчит событие "список готов". У Вас в коде основного класса есть подписка на это событие от этого экземпляра XMLLoader'а, выполняется метод, запускающий загрузку изображений. В этом методе Вы создаете экземпляр другого Объекта - Класса ImageLoader, и подписываетесь на событие COMPLETE от него. Отдаете ему список адресов и говорите "грузи". Экземпляр загружает все изображения как описано в предыдущем посте, складывает их в какое-то хранилище с открытым доступом и диспатчит событие COMPLETE. Основной класс получает это событие и запускает обработчик, вызывающий уже дальнейшие действия по демонстрации этих изображений. Для того и нужны классы, что они представляют из себя логические блоки, делающие какую-то определенную работу (специализация). Другим классам не надо ничего знать о их способах работы и устройстве (инкапсуляция). В этом простейшем примере есть Основной класс Main, который руководит парадом, он как штаб - получает сводки о происходящем и на сновании событий отдает приказы. - Загрузить xml-ку! (проходит время) - "xml-ка загружена!" (XMLLoader.COMPLETE) - Загрузить картинки из списка xml! (проходит время) - "Картинки загружены!" (ImageLoader.COMPLETE) - Показать загруженные картинки! Ни один из этих классов понятия не имеет, что происходит "внутри" другого. Каждый выполняет свою работу, и, закончив, отчитывается штабу Main. Main "забирает" результат (обычно доступ к нему организуется через геттер data, т.е. для Main, получившего событие event - event.target.data) и поручает его следующему батальону со специальным назначением. Надеюсь я ответил на Ваш вопрос..))) |
Все понял.
Один вопрос, если не возражаете. По поводу геттер data: вот такую ошибку выдает: Код AS3:
Если да - то как это сделать? |
Ну а как же. Конечно вручную. Это ведь ВАШ класс, мало ли какие у него задачи и какой тип данных возвращает этот геттер - строку? масссив? XML?
Код AS3:
|
Теперь понятно.
Спасибо. |
Вложений: 1
Есть уже написанная штука, которая даже работает :-)
|
| Часовой пояс GMT +4, время: 11:47. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.