RemoteProxy class を考えてみる。

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 クラスを作って確保してあります。

・・・・・

今日はシドニーは雨で結構寒いってのに、カフェはマックスでクーラー効きまくってる。
確かにオージーは冬でも半袖着てるしなあ。。超、さみー!!

ページの一番上へ移動

トラックバック

この記事へのトラックバック URL は下記の通りです。
http://www.convexstyle.net/mt/mt-tb.cgi/149

コメントの投稿

初めて投稿される方のコメントは管理者の承認が必要となります。ご了承ください。