カテゴリー
Develop 未分類

progression検証 #15 CastImageLoaderをコマンドで監視編

なんだかまさに付箋状態になりつつある”Progression3″・・・。
ということでもう一つ追加。
外部からを読み込むのに使う”CastImageLoader”。これは”.display.Loader”のサブクラスなので”LoadChild(←flash.events.EventDispatcher)”と違ってコマンドで処理待ちしてくれない。
これをコマンドで監視できるようにするのはどーすればよいか?というお話。
“Command”クラスを継承して”CastEvent.CAST_LOAD_COMPLETE”でを排出したり、”executeComplete();”したりすればなんかいけそうな気もするが、ちょっとそれはな気がする。
“Func”クラスを用いて、ごにょごにょしたりしてコマンド監視下に置けないかしら?
“after”メソッドの中でゴニャゴニャしてもいけそうな気もするが、今がまわらないのでないようにメモ。


add 2008/11/05 6:06
“Func”クラスを使って実装してみた。単純に”CastImageLoader”の読み込み完了(CastEvent.CAST_LOAD_COMPLETE)をトリガーにして、コマンド処理を継続させる。

こんな感じかな?
イベントプもに定義できたりして、改めて細かい部分まで根回しがしてあってすごいなぁ・・と感心。しかし眠い・・・。

「progression検証 #15 CastImageLoaderをコマンドで監視編」への12件の返信

はじめまして。
今日こちらのProgressionカテゴリを全部読ませていただきました。。。
えっと、ロード周りの終了通知ですが、Listenコマンドを使って終了イベントを受け取るのはどうでしょうか?
助長で少しダサいですが、
気づかれてたらサッとスルーでお願いします(汗
var castImageLoader:CastImageLoader = new CastImageLoader();
var listen:Listen = new Listen(castImageLoader, CastEvent.CAST_LOAD_COMPLETE);
listen.after(function():void {
trace(“読み込み終了イベントを受け取った”);
});
var list:SerialList = new SerialList();
list.addCommand(
function():void {
castImageLoader.load(new URLRequest(“photo.JPG”));
},
listen,
function():void {
trace(“Listenインスタンスが実行された後のコマンド”);
}
);
list.execute();

おお、”Listen”クラスもチラッとみてはいたのですが、実際さわってなかったので助かります!
なるほどーー。ホントに細かい部分まで行き届いていますねえ・・。きちんとドキュメントを通読しないと・・・。
ありがとうございました!

あ、いえいえ。すごい恐縮です。
taka:niumさんはもっとスマートな解決法を持たれてそうなのですが。。。何か情報があればまたエントリーしてもらえるとうれしいですー。
自分のModelクラスへの愛着かなかなか手をだしてなかったのですが、すごい細かいトコまで手が行き届いてて、びっくりしてます。
少し悔しい気持ちもありますがw

>自分のModelクラスへの愛着かなかなか手をだしてなかったのですが
あぁ・・分かりますw
自分も少しそんなところがありますので・・・汗
実際使ってみると足元にも及ばなかったのですが・・・涙
これまでやってきたMVCの概念から頭を切り替えるのに結構四苦八苦しています。
今はCとVはProgressionに任せて、Mを追加しているような変な構造になりつつあります・・・汗
(というか最近はMも通信制御とデータ管理で分かれたような構造になりつつあるのですが・・・)

Func コマンドは addCommand() 内に省略形で設定することができ、一部プロパティも動的に設定可能なので、以下のような記述が可能です。
var loader:URLLoader = new URLLoader();
addCommand(
 function():void {
  // this は匿名関数から自動変換された Func コマンドを指す
  this.dispatcher = loader;
  this.eventType = Event.COMPLETE;
  loader.load( new URLRequest( “hoge.xml” ) );
 },
 new Trace( “読み込み完了” )
);
ただし、外部読み込みの監視については、正直なところ実装が微妙だと思います。
コマンドパターン自体が予定調和な処理の流れに特化してしまっている分、分岐処理との親和性は低いんですよね・・・。
この辺りについては今後の課題でもあるので、検討させていただきますね。

なるほど、この記述をした場合とnew Funcで定義した場合って違いはありますか?(自動的に破棄される?)
>コマンドパターン自体が予定調和な処理の流れに特化してしまっている分、分岐処理との親和性は低いんですよね・・・。
今はエラーの場合等のことを考えて、
dispatchEvent(new CastEvent(CastEvent.CAST_LOAD_COMPLETE));
を戻すようなCastSprite拡張クラスを作って、それをCommandで使用するためにFuncにくるむという形へと迷走していますw
どうもDisplayObject系とEventDispather系がゴチャゴチャになりつつあります。歳なのでなかなかこれまでのDisplayObjectベースでの構造から頭が切り替えられずに下ります・・。
もっとスマートなやり方があると思うのですが、ベストプラクティスに到達するにはもう少し試行錯誤繰り返しさないと・・・・汗

> なるほど、この記述をした場合とnew Funcで定義した場合って違いはありますか?(自動的に破棄される?)
一番分かりやすい違いは、実行前にプロパティ操作ができないので、delay や before() が使えない部分ですねー。
破棄の処理その他は通常の new Func と同じだと思います!

>delay や before() が使えない部分ですねー。
あ、そですね。
>破棄の処理その他は通常の new Func と同じだと思います!
了解でっす!
色々なアプローチがあって悩ましいですが、それはそれで楽しいw

す、すいません。。。
Listenコマンドを検証していたら、インスタンス生成直後にイベント登録されてるわけではなく、コマンドリストから呼び出された時にイベント登録がされてるようでした。
つまり、僕が書いた方法だとloadした後にListenインスタンスがイベント登録を実行して、たまたま読み込みまでのタイムラグがあるため、成立してたみたいです。
でしゃばりました、すみませんです(汗、汗
taka:niumさんがおっしゃられる方法か、+39さんが言われるようにコマンドクラスを拡張する方法がよさそうです。

>つまり、僕が書いた方法だとloadした後にListenインスタンスがイベント登録を実行して、たまたま読み込みまでのタイムラグがあるため、成立してたみたいです。
Liseneのコマンドの登録よりもload完了が早かったりした場合監視できないってことですよね?
でも読み込みのタイムラグはlistenのコマンド登録までの時間よりもはるかに大きいような気もするからload系だと問題ないような気もしますが、どうなんでしょう?
>でしゃばりました、すみませんです(汗、汗
いえいえ~。もうこのブログも間違いだらけなので全然気にしないでくださいw
失敗は成功の母ですからw

>でも読み込みのタイムラグはlistenのコマンド登録までの時間よりもはるかに大きいような気もするからload系だと問題ないような気もしますが、どうなんでしょう?
とりあえずは大丈夫かと思っています。2回ほどプロジェクトでProgressionを使わせてもらったのですが、今のトコListenオブジェクトを使った読み込み監視で問題はでてなかったです。。。
>いえいえ~。もうこのブログも間違いだらけなので全然気にしないでくださいw
失敗は成功の母ですからw
恐縮です(汗
+39さんのブログは、面白くてよく読ませていただいてるので、またコメントとかさせてもらえるとうれしいです。

>今のトコListenオブジェクトを使った読み込み監視で問題はでてなかったです。。。
まぁでも理論上は・・ってことですよね。まぁ確かに例外が発生する可能性はあるかも知れないですよね。(多分無いけどw)
>+39さんのブログは、面白くてよく読ませていただいてるので、またコメントとかさせてもらえるとうれしいです。
はぃ、面白いって言われるのは新鮮ですw Flash周りじゃなくても書き捨てで突っ込んでってください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です