Загружаем внешние ресурсы

Представим, что нашему приложению нужно загрузить некоторые внешние ресурсы. Этими ресурсами могут быть png-файлы (которые в приложении мы будем использовать в виде Bitmap), и xml-файлы. Ну это потому, что мне нужны именно такие ресурсы. Причем файлов может быть несколько, а приложению нужно дождаться, пока загрузятся все, и потом продолжить выполнение.

Для сих целей я сделал класс ResourceLoader. Ему передаются линки на ресурсы, которые нужно загрузить, потом вызвается метод Load. По линкам класс определяет, какой вид ресурса и как нужно загрузить, загруженные данные сохраняет в Hash, откуда их можно будет получить по id-ресурса. Для png-файлов таким id будет сам url картинки, а для xml-файлов id должен быть указан в аттрибуте корневого узла. Ну и когда все файлы будут загружены, ResourceLoader оповестит приложение, что можно рабоать дальше.

/**
 * @author Yzh
 */

package com.yzh44yzh.core;

import flash.display.Loader;
import flash.display.Bitmap;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;

class ResourceLoader
{
        // constants
        static inline var REG_BITMAP:   EReg = ~/.png$/i; //TODO - jpg, jpeg
        static inline var REG_XML:      EReg = ~/.xml$/i;
       
        // properties
        public var ReadyHandler:        Void->Void;

        private var busy:               Bool;
        private var numLoaded:          Int;
        private var toLoad:             List<String>;
        private var bitmaps:            Hash<Bitmap>;
        private var xmls:               Hash<Xml>;

        // constructor
        public function new()
        {
                this.busy = false;
                this.toLoad = new List();
                this.bitmaps = new Hash();
                this.xmls = new Hash();
        }

        // getters & setters

        // methods
        public function Add(url:String):Void
        {
                if(this.busy) throw 'ResouceLoader is busy';

                //TODO - check is this url not added yet
                this.toLoad.add(url);
        }

        public function Load():Void
        {
                this.busy = true;
                this.numLoaded = 0;

                for(url in this.toLoad)
                {
                        if(REG_BITMAP.match(url))
                        {
                                var bl = new Loader();
                                bl.contentLoaderInfo.addEventListener(Event.COMPLETE, OnBitmap);
                                bl.load(new URLRequest(url));
                        }
                        else if(REG_XML.match(url))
                        {
                                var xl = new URLLoader();
                                xl.dataFormat = 'text';
                                xl.addEventListener(Event.COMPLETE, OnXml);
                                xl.load(new URLRequest(url));
                        }
                }
        }
       
        public function GetBitmap(id:String):Bitmap
        {
                return this.bitmaps.get(id);
        }

        public function GetXml(id:String):Xml
        {
                return this.xmls.get(id);
        }

        private function OnBitmap(event:Event):Void
        {
                var id:String = event.target.url;
                var bitmap:Bitmap = event.target.loader.content;
                this.bitmaps.set(id, bitmap);

                this.numLoaded++;
                if(this.numLoaded == this.toLoad.length) this.Ready();
        }

        private function OnXml(event:Event):Void
        {
                var xml:Xml = Xml.parse(event.target.data);
                var id:String = xml.firstElement().get('id');
                this.xmls.set(id, xml);

                this.numLoaded++;
                if(this.numLoaded == this.toLoad.length) this.Ready();
        }

        private function Ready():Void
        {
                this.busy = false;
                this.toLoad.clear();
                this.ReadyHandler();
        }

        public function toString():String { return 'ResourceLoader'; }         
}

Пример использования класса:

this.loader = new ResourceLoader();
this.loader.ReadyHandler = this.Start;
this.loader.Add('skin.png');
this.loader.Add('skin.xml');
this.loader.Load();