0

У меня есть произвольное количество файлов, которые мне нужно загрузить в приложении 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 в качестве индекса? Будет ли это иметь какие-то странные зависимости?

Приветствия

ответ

2

Вы можете использовать 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)); 
} 
+0

Благодарим вас за внимание к проблеме Loader vs. Loader.loader; он несет постоянное внимание. Я использую анонимные функции, когда они одноразовые и не ссылаются ни на кого. В то время как очередь проще кодировать, удар по производительности может быть значительным, так как ОС может делать много файлов параллельно. Cheers –

 Смежные вопросы

  • Нет связанных вопросов^_^