Произвольное количество анонимных загрузчиков с индивидуальными данными? - PullRequest
0 голосов
/ 12 мая 2009

У меня есть произвольное количество файлов, которые нужно загрузить в приложение AIR.

Я хочу перебрать массив объектов File и создать и запустить Loaders для каждого из них File.url.

Когда они будут завершены (событие COMPLETED или IOErrorEvent.IO_ERROR), я хочу где-то заполнить их данные. Если они терпят неудачу, я хочу сделать отчет об исключении. Я не могу найти какой-либо способ ссылки на объект File из прослушивателя событий (конечно, не IO_ERROR)

Лучшим способом было бы создать отдельные обработчики событий для каждого средства запуска, в котором была жестко запрограммирована информация о файле. По крайней мере, я мог бы использовать саму функцию в качестве индекса для словаря:

foo(fileToLoad : File) : void
{
    var theCompletedHandler : Function = 
    {
        var theFile : File = completedHandlerLookup[?????? this function ?????];
        var theData : ImageData = 
            new ImageData(theFile.url, (_loader.content as Bitmap).bitmapData);

        // do something with the data

        delete completedHandlerLookup[?????? this function ?????];
        delete errorHandlerLookup.findByValue(theFile); // [sic]
    }

    var theErrorHandler : Function = 
    {
        var theFile : File = errorHandlerLookup[?????? this function ?????];

        // report the error

        delete errorHandlerLookup[?????? this function ?????];
        delete completedHandlerLookup.findByValue(theFile); // [sic]
    }

    completedHandlerLookup[theCompletedHandler] = theCompletedHandler;
    errorHandlerLookup[theCompletedHandler] = theErrorHandler;

    var theLoader : Loader = new Loader();
    theLoader.addEventListener(Event.COMPLETE, theCompletedHandler); 
    theLoader.addEventListener(IOErrorEvent.IO_ERROR, theErrorHandler); 
    theLoader.load(new URLRequest(fileToLoad.url));

Могу ли я использовать event.currentTaget и использовать экземпляр Loader в качестве индекса? Будет ли это иметь какие-то странные зависимости?

Приветствия

1 Ответ

2 голосов
/ 12 мая 2009

Вы можете использовать event.currentTarget в качестве поиска индекса, , пока вы удаляете все свои ссылки, у вас не должно возникнуть проблем. Однако обратите внимание, что прослушиватели событий загрузчика добавляются в loader.contentLoaderInfo, поэтому доступ к загрузчику осуществляется через e.currentTarget.loader.

Также стоит упомянуть, что более простой подход в этой ситуации заключался бы в построении системы на основе очередей, поэтому она загружала только один файл за раз. Например, хранение всех файлов в массиве. Затем в COMPLETE или IO_ERROR вы обработаете текущий файл, а затем начнете следующий. Это было бы немного лучше по ресурсам (только один загрузчик), и избежать проблем со сборкой мусора.

Мне также немного любопытно, почему вы используете анонимные функции? Они не очень хороши с точки зрения сборки мусора и на самом деле усложняют эту ситуацию. Это требование?

Редактировать: Вот примерный (и неполный) пример того, как система на основе очереди решит эту проблему.

var loader:Loader;
var queue:Array;

function addFile(file:File):void
{
     queue.push(file);
}

function handleLoadedAsset(e:Event):void 
{
    var currentFile:File= queue[0];
    //do whatever
    stepQueueForward();
}

function handleFailedAssetLoad(e:IOErrorEvent):void 
{
    var currentFile:File = queue[0];
    //clean up
    stepQueueForward();
}

function stepQueueForward():void
{
    queue.splice(0, 1);
    var nextFile:File = queue[0];
    loader.load(new URLRequest(nextFile.url));
}
...