0

AIR 응용 프로그램에서로드해야하는 임의의 수의 파일이 있습니다.개별 데이터가있는 임의의 수의 익명 로더 핸들러가 있습니까?

File 객체의 배열을 반복하고 각각의 File.url에 대해 Loader를 만들고 실행하려고합니다.

이벤트가 완료되면 (이벤트 COMPLETED 또는 IOErrorEvent.IO_ERROR) 데이터를 어딘가에 채우고 싶습니다. 실패 할 경우 예외 보고서를 작성하려고합니다. 나는 이벤트 리스너 (물론 IO_ERROR가 아님)로부터 File 객체를 참조 할 방법을 찾을 수 없다.

가장 좋은 방법은 File 정보가 "하드 코딩 된"각 Launcher에 대한 개별 이벤트 처리기를 만드는 것이다. 적어도, 나는 사전에 지표로 함수 자체를 사용할 수 있습니다

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 이벤트 리스너는 loader.contentLoaderInfo에 추가되므로 e.currentTarget.loader를 통해 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와 Loader.loader 문제를 강조해 주셔서 감사합니다. 그것은 끊임없이 관심을받습니다. 익명 함수는 한 번 사용하고 다른 사람이 참조하지 않는 경우 익명 함수를 사용합니다. 대기열을 코딩하는 것이 더 쉽지만 OS가 많은 파일을 병렬로 처리 할 수 ​​있으므로 성능이 크게 저하 될 수 있습니다. 건배 –

관련 문제