2010-02-27 5 views
2

데이터를 처리 할 때, 난 항상 다음 작성해야합니다 : 내가 분리되는이 두 객체의 유용성과 이벤트 리스너를 이해할 수있는 동안 그들은 종종 내가 알고 싶습니다 서로 작동하기 때문에,Actionscript 3.0에서 URLRequest, URLLoader 및 Complete Event Listener 결합?

var dataSourceRequest:URLRequest = new URLRequest("/path/file.xml"); 
var dataSourceLoader:URLLoader = new URLLoader(dataSourceRequest); 
dataSourceLoader.addEventListener(Event.COMPLETE, handleDataSource); 

그들 모두를 결합 할 방법이 있다면? 내가 얻을 수있는 가장 가까운이이지만, 조금 무의미/중첩의 :

var dataSourceLoader:URLLoader = new URLLoader(new URLRequest("/path/file.xml")); 
dataSourceLoader.addEventListener(Event.COMPLETE, handleDataSource); 

난 정말 자동으로 다음과 같이 된 URLRequest, URLLoader 및 완료 이벤트 리스너를 결합한 것이 될 것이다 싶지만 무엇을 :

var dataSource:Whatever = new Whatever("/path/file.xml", handleDataSource); 

답변

3

아니요 ... 어도비가 만든 건축상의 결정이며, 좋은 결정입니다. 2 개의 2 개의 종류는 아주 다른 일을하고 그 일을 잘한다. 이벤트 리스너를 사용하면 complete 이벤트를 여러 번 처리 할 수 ​​있으므로이 인스턴스의 콜백보다 훨씬 유연합니다.

그러나 모든 기능을 포함하고 원하는 방식으로 작동하는 클래스를 만들 수는 있습니다.

+0

대부분 내가 이해할 수있는,하지만 난 상상하려고 힘든 시간을 보내고있어 URLLoader가없는 URLRequest (vice versa). 그래서 적어도이 두 가지를 결합하는 내장 옵션이없는 이유는 조금 궁금합니다. "new"를 쓰는 것과 같습니다. 이것은 다른 언어와 마찬가지로 여기에 있다고 가정합니다. 메모리를 할당하고 객체를 시작합니다. – TheDarkIn1978

+1

URLRequest는 자신의 개체 인 이유 이상의 URL을 캡처 할 수 있습니다. 예 URLLoader에는 URLRequest가 필요합니다. 그렇다면 로더와 사운드 같은 수업도 마찬가지입니다. 따라서 URLRequest가 여러 장소에서 사용되는 것을 볼 수 있는데 이는 다른 좋은 장소입니다. 그것들을 개별적으로 만드는 것은 개발자들에게 훨씬 더 많은 융통성을 주며 우리가 언급 한 커스텀 로더와 같은 객체를 생성 할 수 있도록합니다. –

4

코드를 자신의 클래스에 캡슐화하십시오.

package 
{ 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    public class EncapsulatedURLLoader 
    { 
     protected var _callback:Function; 

     public function EncapsulatedURLLoader(dataUrl:String, callback:Function) 
     { 
      _callback = callback; 
      var l:URLLoader = new URLLoader(); 
      l.addEventListener(Event.COMPLETE, onComplete); 
      l.load(new URLRequest(dataUrl)); 
     } 

     private function onComplete(event:Event):void 
     { 
      event.target.removeEventListener(Event.COMPLETE, onComplete); 
      _callback.call(null, event.target.data); 
     } 
    } 
} 

지금처럼 사용 : 그것은이처럼 간단 할 수있는 이벤트 리스너가 별도의 유지해야하는 이유

function onLoaded(data:*):void 
{ 
    trace(data); 
} 

var l:EncapsulatedURLLoader = new EncapsulatedURLLoader("xml/data.xml", onLoaded);