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

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

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

Регистрация: Jul 2011
Сообщений: 21
По умолчанию Сложное взаимодействие классов

Здравствуйте. Ситуация такова:

Класс А:
- имеет метод С получающий URL файла в кач-ве параметра
- метод С начинает загружать файл и добавляет загрузчику слушателя Д, который запускается как только файл загружен
- слушатель Д парсит файл, как только он загружен


Класс Б:
- создает экз. класса А
- вызывает метод С, передает ему УРЛ файла



Вопрос: как мне в классе Б получить результат парсинга?
Прошу прощение за абстрактное описание проблемы, если ничего не понятно, я попробуй переформулировать.
Благодарю за помощь!


Класс А:
Код AS3:
package tools{
	import flash.net.URLRequest;
	import flash.net.URLLoader;
	import flash.events.Event;
	public class XmlToArr {
 
		private var playlistXml:XML;
		private var xmlUrlRequest:URLRequest;
		private var xmlUrlLoader:URLLoader;
		public function XmlToArr (xmlUrl:String) {
		}
 
		public function Convert (xmlUrl:String) {
			this.xmlUrlRequest = new URLRequest(xmlUrl);
			this.xmlUrlLoader = new URLLoader(this.xmlUrlRequest);
			this.xmlUrlLoader.addEventListener (Event.COMPLETE,listenerComplete);
		}
 
		private function listenerComplete (event:Event) {
			this.playlistXml = new XML(this.xmlUrlLoader);
		}
	}
}


Класс Б:
Код AS3:
package player{
	import tools.XmlToArr;
	import flash.display.MovieClip;
 
	public class Playlist extends MovieClip {
		private var playlistUrl:XML;
		public var playlistArr:Array;
 
		public function Playlist (playlistUrl:String):void {
			var newXmlToArr:XmlToArr = new XmlToArr(playlistUrl);
			newXmlToArr.Convert(playlistUrl);
		}
	}
}

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
В метод С передать ещё и функцию, которую вызвать по завершению и передать в неё чего хочется. Или Д по завершению парсинга диспатчит евент, на который подписывается Б.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
Одно из двух - или создать класс M, который расширяет класс Event, добавляя свойство file и диспатчить его потом классом A, в котором надо назначить слушатель вашего события:
Код AS3:
class YourEvent extends Event {
 
	public var file:ByteArray;
	public static const YOUR_EVENT_TYPE:String = "yourEventType";
	public function YourEvent (...args) {//Так делать неправильно, но я не помню всех входных данных Event
		super(args[0],args[1],args[2])
	}
 
}
 
class A {
 
	public var bInstance:B = new B();
		public function A () {
			bInstance.addEventListener(YourEvent.YOUR_EVENT_TYPE,getYourFile);
			bInstance.loadThis('someUrl');
		}
 
		private function getYourFile(e:YourEvent):void {
			var loadedFile:ByteArray = e.file;
			<...>
		}
 
}
 
class B extends EventDispatcher {
 
	public function B () {
 
	}
 
	public function loadThis(url:String) {
		var loader:Loader = new Loader();
		loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteListener);
		loader.load(new URLRequest(url));
	}
 
	private function loadCompleteListener(e:Event):void {
		var event = new YourEvent(YoueEvent.YOUR_EVENT_TYPE);
		event.file = e.currentTarget.loader.content;
		dispatchEvent(event);
	}
 
}
Либо по загрузке файла класть его одним из свойств класса B и диспатчить "комплит" заново. В А соответственно слушать комплит и при необходимости - брать файл из свойства экземпляра B.
Код AS3:
class A {
 
	public var bInstance:B = new B();
	public function A () {
		bInstance.addEventListener(Event.COMPLETE, getYourFile);
		bInstance.loadThis('someUrl');
	}
 
	private function getYourFile(e:YourEvent):void {
		loader:B = e.currentTarget as B; // или же просто bInstance
		if (loader) {
			var loadedFile = loader.file;
			<...>
		}
	}
 
}
 
class B extends EventDispatcher {
	public var file:ByteArray;
	public function B () {
 
	}
 
	public function loadThis(url:String) {
		var loader:Loader = new Loader();
		loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteListener);
		loader.load(new URLRequest(url));
	}
 
	private function loadCompleteListener(e:Event):void {
		file = e.currentTarget.loader.content;
		dispatchEvent(e);
	}
 
}
Первый вариант мне больше нравится, хоть и не всегда есть смысл создавать свои события
__________________
Дебаггер не предлагать


Последний раз редактировалось BuKT; 06.07.2011 в 12:19.
Старый 06.07.2011, 12:24
Kolyunya вне форума Посмотреть профиль Отправить личное сообщение для Kolyunya Найти все сообщения от Kolyunya
  № 4  
Ответить с цитированием
Kolyunya

Регистрация: Jul 2011
Сообщений: 21
Спасибо большое за ответы! Я прочел офф. справку но не понял ровным счетом ничего.... Попробую перечитать, но может кто кинется в меня статейкой, что такое диспач.
Прошу прощения, я в АС3 всего пару дней.

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

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
Если всё настолько плохо - лучше почитать Колина Мука, главу про событийную модель. Диспач - это одна из основ ActionScript асинхронности
__________________
Дебаггер не предлагать

Старый 06.07.2011, 13:44
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 6  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Диспач - это одна из основ ActionScript асинхронности
Во флеше (пока) один поток. Синхронный он.
__________________
тут я

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

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
А так?
Цитата:
ActionScript-"асинхронности"
__________________
Дебаггер не предлагать

Старый 06.07.2011, 14:01
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 8  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Насколько мне известно, ассинхронны только лоадеры
__________________
тут я

Старый 07.07.2011, 21:41
zxcv вне форума Посмотреть профиль Отправить личное сообщение для zxcv Найти все сообщения от zxcv
  № 9  
Ответить с цитированием
zxcv
 
Аватар для zxcv

Регистрация: May 2011
Адрес: 0,0,0 относительно меня
Сообщений: 123
Цитата:
Сообщение от КорДум Посмотреть сообщение
Насколько мне известно, ассинхронны только лоадеры
а у них есть синхронный аналог?

Старый 07.07.2011, 22:27
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 10  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Цитата:
а у них есть синхронный аналог?
пока что нет

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

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

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


 


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


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