複数ファイルのローダ

ファイルひとつをロードする場合、 Loader クラスの COMPLETE イベントで簡単にロード完了を待つ事ができます。
ですが、複数のファイルをロードしたい場合、それだけではうまくいきません。
以下、私が考えた方法を記述。

コード

package
{
  import flash.display.Loader;
  import flash.net.URLRequest;
  import flash.system.ApplicationDomain;
  import flash.system.LoaderContext;
  import flash.events.Event;
  import flash.events.EventDispatcher;

  public class FileLoader extends EventDispatcher
  {
    // カスタムイベントの完了通知
    public static const LOAD_COMPLETE:String = "load_complete";
    // ロードするファイル数のカウンタ
    private var counter:int;
    // ファイルを格納する連想配列
    private var fileHash:Object = new Object();
    // LoaderContext を定義しておく
    private var context:LoaderContext;

    // FileLoader
    public function FileLoader(fileAry:Array) {
      // LoaderContext の初期化
      context = new LoaderContext();
      context.applicationDomain = ApplicationDomain.currentDomain;
      // ロードされるファイル数をセット
      counter = fileAry.length;
      // fileAry で指定されたファイルをすべてロード
      for each(var fileObj:Object in fileAry) {
        loadFile(fileObj);
      }
    }

    // ファイルのロード
    private function loadFile(fileObj):void {
      var myLoader:Loader = new Loader;
      var myRequest:URLRequest = new URLRequest(fileObj.path);

      fileHash[fileObj.fileName] = myLoader;
      myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, informComplete);
      myLoader.load(myRequest, context);
    }

    // ロード完了時イベント
    private function informComplete(event:Event):void {
      event.target.removeEventListener(Event.COMPLETE, informComplete);
      // 未ロードのファイルの存在を確認し、なければ LOAD_COMPLETE を通知
      if(--counter <= 0) dispatchEvent(new Event(LOAD_COMPLETE));
    }

    // ロードしたファイルを返す
    public function getFiles():Object {
      return fileHash;
    }
  }
}

利用サンプル

var fileAry = [
  {path : "misao.jpg", fileName : "misaoLoader"} ,
  {path : "yuki_2.jpg", fileName : "nagatoLoader"}
]

var fileLoader = new FileLoader(fileAry);
fileLoader.addEventListener(FileLoader.LOAD_COMPLETE, onComp);

function onComp(event:Event):void {
  event.target.removeEventListener(FileLoader.LOAD_COMPLETE, onComp);

  var files = fileLoader.getFiles();
  addChild(files.misaoLoader);
}

改善ポイント

  • Object のキーは取得できないのか?
    • 使うかどうかはともかく、キーを取得できるなら別の書き方もできるかも。
  • Loader 以外のクラスに対応していない(Sound とか)
    • ファイルのパスの他に、形式も指定させるとか。
  • エラー処理
    • 手抜きました、すいません。

まとめ

やはり実際に一個アプリを作った後だと、色々思いつく事が多いですね。
今からでも遅くないし、リファクタリングしてしまおうかな?
これがベストとは思えないので、もっとうまいやり方をご存知の方は、是非ご教授願います。
後、はてな記法ActionScript のファイルタイプって何を指定すればいいんでしょうか。。。