PDA

Просмотр полной версии : Комплиты с лоадера приходят не в правильном порядке


Astraport
05.10.2011, 01:13
protected function button1_clickHandler(event:MouseEvent):void
{

for (var i:uint = 0; i < myArray.length; i++) {
var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("images/" + i + ".jpg");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(request);
}
}
protected function onComplete(event:Event):void
{
trace (LoaderInfo(event.target).url);
}
В трейсе такое
file:///C|/Users/Astraport2011/Adobe%20Flash%20Builder%204.5/c3d/bin%2Ddebug/images/4.jpg
file:///C|/Users/Astraport2011/Adobe%20Flash%20Builder%204.5/c3d/bin%2Ddebug/images/2.jpg
file:///C|/Users/Astraport2011/Adobe%20Flash%20Builder%204.5/c3d/bin%2Ddebug/images/0.jpg
file:///C|/Users/Astraport2011/Adobe%20Flash%20Builder%204.5/c3d/bin%2Ddebug/images/3.jpg
file:///C|/Users/Astraport2011/Adobe%20Flash%20Builder%204.5/c3d/bin%2Ddebug/images/1.jpg
Почему нарушается порядок?
При этом порядок один и тот же сохраняется при каждом дебаге. Однако если вызывать функцию несколько раз в запущенном приложение, то второй раз тоже что первый, а вот третий, четвертый и пятый по разному. Потом опять по кругу.

stweet
05.10.2011, 01:17
"Loader" - "event.target" потому что это объект а не массив. А объекты не сортируются как массив по индексу. Ручками)

trng
05.10.2011, 01:23
loader.load - асинхронный метод. То есть неизвестно когда наступит Event.COMPLETE для конкретного loader.
Грубо можно считать, что чем больше картинка, тем позже наступает Event.COMPLETE.
Сравнение объект/массив здесь ни при чем.

Лоадеры у вас создаются внутри цикла - поэтому их много (myArray.length-1 штук).
И для каждого из них возникает Event.COMPLETE.

Astraport
05.10.2011, 01:31
И какое решение?
Пока вижу - считать пока не случиться Event.COMPLETE для myArray.length раз. Каждый раз сохраняя данные в отдельном массиве. Затем сортировать массив.

trng
05.10.2011, 01:47
Не совсем понятно зачем привязываться к порядку загрузки, но если уж это так принципиально, то есть два варианта:

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

protected var currentPic:int = 0;
protected function button1_clickHandler(event:MouseEvent):void
{
var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("images/" + currentPic + ".jpg");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(request);
}

protected function onComplete(event:Event):void
{
trace (LoaderInfo(event.target).url);
currentPic++;
if (currentPic == myArray.length) return;
var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("images/" + currentPic + ".jpg");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(request);
}


2. Если порядок не важен, а важно дождаться загрузки ВСЕХ картинок, то тоже с переменной currentPic, и когда currentPic == myArray.length - можно приступать к дальнейшим действиям.

Astraport
05.10.2011, 02:08
trng, спасибо.

Второй вариант понятен, а вот первый после загрузки первой картинки выдает ошибку:
SecurityError: Error #2000: Отсутствует активный контекст безопасности.

Добавлено через 2 минуты
Упс... Сорри. Моя ошибка. Все работает и по первому варианту! Спасибо.