Цитата:
|
Сообщение от in4core
Dukobpa3 - так покажи как надо!
|
Цитата:
|
Сообщение от Isfet
выложите свой кусок , чтобы было понятно как надо..,
|
У меня есть вот такой вот
пакетик. Пользуюсь уже несколько лет.
Недавно наводил порядки там и выпилил немного костыльного функционала, в том числе и криво написанный хттп-коннектор, в итоге там остался реализован только сокет(хттп уже давно не использовал, так я и не переживал).
Но я планировал добавить туда и хттп-коннектор. Возможно как раз будет повод.
Я честно вот сегодня пытался на костылях нечто собрать чтоб сюда скинуть, но костыли мне не понравились. Сделаю адекватно, расширю функционал своего пакета. Можно за репозиторием следить.
Добавлено через 4 минуты
Костыли частично показать могу:
Абстрактная команда. Ее расширяют наши остальные
конкретные команды.

Код AS3:
package connector.commands
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import project.model.SomeModel;
internal class Command extends EventDispatcher
{
protected static const SERVER_URL:String = "http://your.server.url/";
protected var _urlLoader:URLLoader = new URLLoader();
protected var _urlRequest:URLRequest = new URLRequest();
// Каким-то образом ссылка на модель должна попасть в команду.
// не хочу об этом думать. new SomeModel точно не конает, потмоу что она должна быть одна у всех.
// Но это как вариант, и абсолютно не факт что ссылка на модель будет в базовой команде.
// так как каждая команда скорее всего будет работать с другой моделью.
protected var _model:SomeModel = new SomeModel();
final public function execute(data:Object):void
{
prepareLoader(data);
_urlLoader.addEventListener(Event.COMPLETE, onRequestComplete);
_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onError);
_urlLoader.load(_urlRequest);
}
protected function prepareLoader(data:Object):void
{
throw new Error("Should be overriden by sub classes");
}
protected function processData(data:Object):void
{
throw new Error("Should be overriden by sub classes");
}
private function onRequestComplete(e:Event):void
{
_urlLoader.removeEventListener(Event.COMPLETE, onRequestComplete);
_urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onError);
processData(_urlLoader.data);
}
private function onError(event:IOErrorEvent):void
{
trace("error");
}
}
}
Команда авторизации:

Код AS3:
package connector.commands
{
import project.model.data.AuthResponceDo;
internal class AuthCommand extends Command
{
private static const SERVICE_URL:String = "auth.php";
override protected function prepareLoader(data:Object):void
{
// Эта команда простенькая, ниче настраивать не надо кроме урла.
_urlRequest.url = Command.SERVER_URL + SERVICE_URL;
}
override protected function processData(data:Object):void
{
// парсинг будет совсем не такой, так как понятно что с сервера прилетит не этот тип Если у нас не амф.
// для примера покатит.
var parcedData:AuthResponceDo = data as AuthResponceDo;
// Здесь просто вызывается метод модели. Но может быть любой другой набор действий.
_model.auth(parcedData);
}
}
}
Команда хода в бою:

Код AS3:
package connector.commands
{
import connector.commands.data.BattleTurnDto;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import project.model.data.TurnResponceDo;
internal class BattleTurnCommand extends Command
{
private static const SERVICE_URL:String = "battle_turn.php";
override protected function prepareLoader(data:Object):void
{
// тут команда посложнее, и она шлет во флешварах данные.
var dto:BattleTurnDto = data as BattleTurnDto;
if (!dto) throw new Error("а нифига, надо передать BattleTurnDto");
_urlRequest.url = Command.SERVER_URL + SERVICE_URL;
var variables:URLVariables = new URLVariables();
variables.battle_id = dto.battle_id;
variables.unit_id = dto.unit_id;
_urlRequest.data = variables;
_urlRequest.method = URLRequestMethod.GET;
}
override protected function processData(data:Object):void
{
// см. авторизацию. Суть та же. Это фейк.
var parcedData:TurnResponceDo = data as TurnResponceDo;
_model.turn(parcedData);
}
}
}
Вспомогательный класс структурка для команды хода:

Код AS3:
package connector.commands.data
{
public class BattleTurnDto
{
public var battle_id:String;
public var unit_id:String;
}
}
Суть в том что на каждый месадж создаем отдельный класс который умеет слать запрос на сервер и обрабатывать ответ на него.
Эта часть сравнительно не костыльная получилась и надеюсь идею передал.
А вот по части менеджмента этих команд уже есть варианты. И с этими вариантами начались костыли на решение которых я уже не захотел тратить больше времени чем планировал.
Добавлено через 11 минут
Вот пример использования костыльного манагера, который я показывать не хочу

Код AS3:
CommandManager.init();
CommandManager.executeCommand(CommandList.COMMAND_AUTH);
var turnDto:BattleTurnDto = new BattleTurnDto();
turnDto.battle_id = "1";
turnDto.unit_id = "10";
CommandManager.executeCommand(CommandList.COMMAND_BATTLE_TURN, turnDto);