RemoteProxy class を考えてみる。
2009年11月08日 17:13
Flash プロジェクトで大抵外部にアクセスするのは画像・XML・API・Remoting・バイナリ通信・たまにテキスト辺りだと思うので、プロジェクト毎に各 View クラスの 親クラスに必要な Proxy クラスを拡張した RemoteProxy のインスタンスを protected で出し入れしておくとかなり楽な気がする。Loader・URLLoader や独自ラッパークラスのインスタンス生成を View 毎にする必要が無くなる。
RemoteProxy の強みは何と言っても Dynamic クラスのため、プロパティや関数を動的に作成することが出来ること。いちいちその都度その都度外部にアクセスするために public 関数を独自に定義するを必要が無い。要は callProperty で設定する関数の syntax や setProperty で渡す変数名を個人的な決め毎で設定しておけば、かなりの確率で再度設定する必要が無い。
例えば、Zend_Amf_Server の UserController の debug という関数を呼び出すとすると、View クラスでは
this._cfZendAmfProxy.addEventListener(CFZendAmfProxyEvent.RESULT, _resultHandler, false, 0, true);
this._cfZendAmfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true);
this._cfZendAmfProxy.UserController_debug('Hello World');
で、RemoteProxy class 内部は
flash_proxy override function callProperty(method:*, ...params):*
{
_call(method, params);
}
private function _call(method:*, params:*):void
{
var methodName:String = method.toString();
if(methodName.indexOf("_"))
methodName = methodName.split("_").join(".");
this._nc.call(methodName, this._responder, params[0]);
}
また、Zend_Amf_Server の UserController の sendMail という関数を呼び出すとすると、View クラスでは
this._cfZendAmfProxy.addEventListener(CFZendAmfProxyEvent.RESULT, _resultHandler, false, 0, true); this._cfZendAmfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true); this._cfZendAmfProxy.UserController_debug(mailVO);
という感じで RemoteProxy class の内部は変わらない。
また、画像や XML の読み込みは下記の様な感じで設定して
this._cfProxy.xml = "test.xml"; this._cfProxy.addEventListener(Event.COMPLETE, _completeHandler, false, 0, true); this._cfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true); this._cfProxy.loadXml(); // もしくは this._cfProxy.asset = "test.jpg"; this._cfProxy.addEventListener(Event.COMPLETE, _completeHandler, false, 0, true); this._cfProxy.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorHandler, false, 0, true); this._cfProxy.loadAsset();
で、RemoteProxy class 内部は
flash_proxy override function callProperty(name:*, ...args):*
{
var methodName:String = name.toString();
switch(methodName)
{
case "loadXml":
{
_loadXml();
break;
}
case "loadAsset":
{
_loadAsset();
break;
}
default:
{
_call(methodName, args);
break;
}
}
}
view 側では基本は4行ぐらいで済む。
Event が dispatch されたらきちんと removeEventListener はしておいた方が良い。
個人的には、FlickrProxy とか Twitter Proxy とか API が充実してるウェブサービス用にも各自 RemoteProxy クラスを作って確保してあります。
・・・・・
今日はシドニーは雨で結構寒いってのに、カフェはマックスでクーラー効きまくってる。
確かにオージーは冬でも半袖着てるしなあ。。超、さみー!!
