ProgressionのLoadURLコマンドを使ってみる。

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2008年4月7日 月曜日21:16:42

Progression Frameworkの中にある、「LoadURL」というコマンドを使って、データのダウンロードを行おうと画策。
が、肝心のチュートリアルがこの状態なので、とりあえず自分で試してみた。
以下、正しい使い方かどうかは知らないがメモ。

■求めるもの

まず、LoadURLコマンドに俺が期待する機能は次の2つ。

  1. データをダウンロードする
  2. ダウンロード完了時に任意の関数を実行する
    1. 基本的には、URLLoaderと同じだと思っているので、この2つが出来ればいいんじゃないかな?という事で探っていこう。

      ■データのロード

      データのロードに関しては、コマンドをシーンに追加すればいいっぽい。

      addCommand(new LoadURL(new URLRequest(url)));

      ただし、これだとIO/セキュリティエラー発生時とか、ロード終了後に何も出来ない、役立たずなコマンドが出来上がるだけのようだ。
      と言う事で、こいつはaddCommand実行時に作成するんじゃなくて、シーンのメンバーにしといた方がよさそうだ。

      調査の結果、こんな感じでシーン内にメンバと関数を定義しておけばよさそう。

      private var _loadURL:LoadURL;
      ・・・
      private function createLoadURL(req:URLRequest):void {
          _loadURL = new LoadURL(req);
          _loadURL.addEventListener(CommandCatchEvent.ERROR , onError);
          _loadURL.addEventListener(CommandCatchEvent.Exception , onException);
          _loadURL.after(this , parseData);
      }
      private function onError(e:CommandCatchEvent):void {
          //エラー発生時の処理
          //IOErrorEvent、SecurityErrorEvent発生時に、ここに飛んでくる
      }

      private function onException(e:CommandCatchEvent):void {
          //例外発生時の処理
      }

      で、使用時は

      addCommand(this._loadURL);

      ロード完了時に呼ばれる関数parseDataは、シーン内にこんな風に定義する。

      private function parseData():void {
          //ダウンロードしたデータはthis._loadURL.dataにObject型で格納されているので、
          //一旦使いやすい型(ByteArrayとか、IDataInputとか)に変換する
          var data:IDataInput = this._loadURL.data as IDataInput;
      }

      これでいいはずだが、今一正解がわからないのがタマにキズ。

      あと、問題はキャッシュ。
      同じURLから2回データをダウンロードしようとしたら、2回目以降はキャッシュが有効になっていた。俺としては毎回データを取得しに行って欲しかったのだが、その辺の調整はどうやるのかね?

コメント (2) »

  1. 解説ありがとうございます!

    外部データとの連動方法については、どうするのが一番よいのかどうもパターンが見つけられないので、正解というのが特にない状態です。
    ですので、現状の LoadURL コマンドはかなり中途半端な実装になっていると思います。

    この辺りについては、次のマイナーバージョンアップ時の課題と考えているので、これから何とかしないといけない部分ですね。
    http://forum.libspark.org/modules/xhnewbb/viewtopic.php?topic_id=200&post_id=741&viewmode=thread
    http://forum.libspark.org/modules/xhnewbb/viewtopic.php?topic_id=200&post_id=758&viewmode=thread

    また、コマンドの処理完了時に任意の関数を実行する仕組みとしては、after() メソッドが用意されており、jQuery 的に記述することで好きな関数を実行させることができるようになります。
    イベント待ちを行いたい場合には、Func コマンドの dispatcher 登録でも行えます。

    コマンドについては、チュートリアルに纏めるまでは追い付いていないのですが、ASDoc の方には簡単なサンプルコード付きで解説してありますので、そちらをご確認ください。
    http://progression.libspark.org/htdocs/asdoc/2.0.x/jp/progression/commands/package-detail.html

    まだまだ色々と追い付いていない部分が多いですが、今後もよろしくお願いします。

    コメント by taka:nium — 2008年4月8日 火曜日 @ 22:40:04

  2. >taka:nium さん
    コメントありがとうございます
    SDKだけで開発してる俺としては、外部データは命なので、この辺はかなり気になります。
    なので、色々と試して行こうと思ってます。

    まぁ、本当に難しいのはLoadURLコマンドの使い方じゃなくて、
    どのタイミングでインスタンス生成するかとか、
    取得したデータを加工するべき主体はシーン(command.after(this,function():void{command.data…}))なのか、
    それともコマンド(after(null,function():void{this.data=…}))なのかとか、
    コマンドを使うスタイルだとイベント登録は美しくないのか?とか、
    コマンドをメンバとして持つべきか、関数内で宣言して作成すべきかとか言った、
    考え方的な問題なんですけどね。

    コメント by 太郎 — 2008年4月10日 木曜日 @ 23:18:40

トラックバック URL :

コメントをどうぞ

HTML convert time: 0.593 sec.