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

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

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Комплиты с лоадера приходят не в правильном порядке

Код AS3:
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
Почему нарушается порядок?
При этом порядок один и тот же сохраняется при каждом дебаге. Однако если вызывать функцию несколько раз в запущенном приложение, то второй раз тоже что первый, а вот третий, четвертый и пятый по разному. Потом опять по кругу.

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

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
"Loader" - "event.target" потому что это объект а не массив. А объекты не сортируются как массив по индексу. Ручками)
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 05.10.2011, 01:23
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 3  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
loader.load - асинхронный метод. То есть неизвестно когда наступит Event.COMPLETE для конкретного loader.
Грубо можно считать, что чем больше картинка, тем позже наступает Event.COMPLETE.
Сравнение объект/массив здесь ни при чем.

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


Последний раз редактировалось trng; 05.10.2011 в 01:28.
Старый 05.10.2011, 01:31
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 4  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
И какое решение?
Пока вижу - считать пока не случиться Event.COMPLETE для myArray.length раз. Каждый раз сохраняя данные в отдельном массиве. Затем сортировать массив.

Старый 05.10.2011, 01:47
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 5  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
Не совсем понятно зачем привязываться к порядку загрузки, но если уж это так принципиально, то есть два варианта:

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

Код AS3:
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 - можно приступать к дальнейшим действиям.

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
trng, спасибо.

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

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

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

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

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


 


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


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