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

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

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
По умолчанию "Архитектурное решение" асинхронной загрузки нескольких объектов?

Добрый день, вопрос в следующем:
Допустим у меня из разных мест должны загрузиться данные, содержащие об одном пользователе. Как лучше сделать проверку что и то, и то завершило загрузку? Если один лоадер, то понятное дело просто подписаться на событие Event.COMPLETE, а как быть с двумя? Чтобы проверяло, что оба загрузчика закончили свою работу.

У меня пока два решения. И оба, прямо сказать, не очень меня вдохновляют:
1. Грузить другие данные только после завершения загрузки предыдущих, запускаем один лоадер, как только он закончил работу - запускаем другой. Минус очевиден - пропускная способность канала намного больше, чем требуется в данном случае, поэтому загрузка неоправданно увеличится по времени.

2. Держать два флага, содержащих информацию о том, загрузились ли загрузчик1 и загрузчик2. При выполнении загрузчика ставить его флаг в TRUE и проверять флаг другого, и если он к тому моменту равен TRUE, то переходить к требуемому коду (туда, где требуется загрузка всех данных). У этого способа минус в том, что уж больно "в лоб" да и код как то не очень удобочитаем получается.

Старый 01.07.2013, 10:27
WisP вне форума Посмотреть профиль Отправить личное сообщение для WisP Найти все сообщения от WisP
  № 2  
Ответить с цитированием
WisP

Регистрация: Sep 2003
Сообщений: 28
Реализацию нужно выбирать по задачам, но мне больше нравится второй вариант. Только достаточно одного флага. Когда сработало Event.COMPLETE, проверяем флаг: если false, то ставим в true; если true, то Event.COMPLETE уже срабатывало.

Старый 01.07.2013, 10:38
maincode вне форума Посмотреть профиль Отправить личное сообщение для maincode Посетить домашнюю страницу maincode Найти все сообщения от maincode
  № 3  
Ответить с цитированием
maincode

Регистрация: Feb 2010
Адрес: Город суеты
Сообщений: 191
Попробуйте использовать загрузчик FPLoader: указываем список файлов, вызываем метод start и начинается загрузка. У загрузчика есть возможность выбрать сколько файлов грузить одновременно(сколько текущих потоков может работать одновременно). Иммется событие PROGRESS для каждого файла, и общий для всех. Документация лежит по той же ссылки.
__________________
FlashPress.ru | Blog

Старый 01.07.2013, 11:39
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 4  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Спасибо, полезная ссылка!
Жаль swc, посмотреть логику не получится)

Старый 01.07.2013, 12:06
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 5  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Есть еще bulkLoader и MaxLoader от greensocks. Мне лично больше всего нравиться последний. Желания написать что то свое для решения такой задачи у меня не возникало, все и так устраивает.

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Я не придираюсь, но когда что-то делают в одно время называют синхронным.
Я просто все скопом вызываю и ставлю счетчик равным кол-ву вызовов. При ответе или ошибке уменьшаю его на 1 соответственно. При 0 - идем дальше.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 01.07.2013, 18:13
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 7  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
Добрый день, вопрос в следующем:
У меня пока два решения. И оба, прямо сказать, не очень меня вдохновляют:
Я применяю третье решение. Подписываться "в каждом месте" на обработчики событий мне не интересно. Причем в обоих ваших решениях все равно нужно подписаться два раза. Поэтому пришлось ввести понятие асинхронной операции. AsyncOperation. Она может быть в одном из трех состояний: операция (и степень ее завершенности), ошибка (с описанием) или результат (со значением результата). Плюс возможность подписки на смену состояний (смена "степени завершенности" тоже диспатчится). Все "исходно асинхронные" операции вроде загрузки по сети обучены возвращать этот асинхронный статус. Ну и для красоты сделано несколько комбинаторов.

Async.applySync(function, array). Применяет синхронную функцию (т.е. возвращающую сразу "результат") к аргументам. Если что-то завершилось с ошибкой, считает, что вся операция завершилась с ошибкой (и вовзращает исходный код). Возвращает AsyncOperation.
Async.applyAsync(function, arrray). Применяет асинхронную функцию к асинхронным аргументам. Например, мы загрузили данные и потом по ним будем грузить картинки. Возвращает AsyncOperation.
Async.onComplete(AsyncOperation, function). Применяет функцию, когда асинхронная операция завершилась (с любым результатам). Ничего не возвращает.
Async.onSuccess(AsyncOperation, function), Async.onFailure(AsyncOperation, function) - применяет функцию к результатам в случае успеха/ошибки.

Небольшой бонус (совершенно на другом уровне). App.monitorOp(AsyncOperation). Умеет корреткно отображать "глобальное ожидание" приложения и выводить ошибки (считает ошибки фатальными).

Итого, типичный код выглядит примерно так:
Код AS3:
function doSomething() : AsyncOperation {
  const op1 : AysncOperation = Net.loadXML("www.xml.info", parseSomeXml);
  const op2 : AsyncOperation = Net.loadImage("www.images.org/image.png");
  const xmlImages = Async.applyAsync(loadImages, [op1]);
  return Async.applySync(showWindow, [op2, xmlImages, "op-something");
}
 
function showWindow(image1 : BitmapData, otherImages : Array, notAnAsyncArgument : String) : void {
 // create and show UI window.
}
 
function loadImages(xml : SomeParsedXML) : AsyncOperation {
  return Async.gatherSuccess(Funcs.map(xml.images, function(img : SomeParsedImage):AsyncOperation {
    return Net.loadImage(img.url);
  }));
}
 
// somewhere in other code:
function onMagicButtonClick() : void {
  App.monitorOp(doSomething);
}
Под капотом оно (реализация), конечно же, считает количество загрузок и обрабатывает статусы. Но это ровно в одном месте. А вот используется асинхронность во многих местах. А еще все асинхронные комбинаторы можно в Function.prototype записать (на js я так делал, на AS не пробовал). И будет работать запись somefunction.applyAsync([arguments]).

Старый 01.07.2013, 18:37
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 8  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Можно посмотреть в сторону http://www.as3commons.org/as3-commons-async/index.html
__________________
Отряд Котовскага

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

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

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


 


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


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