[Diebuster -> Non blocking loop] 과제 답변



@ 위에 그림은 제가 브라우져를 확대하다가 우연히 발견하였습니다 ( ㅋ ) 이벤트라도 걸어 놓으신거 아닌지..




@과제 : 
  
  1. non blocking loop가 완료될 때 완료이벤트를 수신할 수 있도록 개선하시오.
  2. 아예 Shape를 상속하도록 개선하시오.
  3. 일반화시켜 클래스로 정리하는 포스팅을 한 건 처음이지만 non blocking에 대해서는 이미 두어 개의 포스트가 블로그 내에 존재하니 찾아보세요.




@답안


*1. , 2. :


Created with colorer-take5 library. Type 'actionscript'

package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    
    public class testE extends Sprite
    {
        public function testE()
        {
            //텍스트필드 한개 생성
            addChild( new TextField() );
            
            //nonBlockingLoop 생성
            var looper:nonBlockingLoop = new nonBlockingLoop();
            
            //nonBlockingLoop 실행
            looper.loop(999 , 10 , Do ,["count : " , " #"] , complete);
        }
        
        //loop target 메소드
        private var testCount : int = 0;
        private function Do($str : String , $str2 : String):void
        {
            TextField(getChildAt(0)).text = $str + testCount + $str2;
            ++testCount;
        }
        
        //완료시 콜백!
        private function complete():void
        {
            TextField(getChildAt(0)).text = "comp!";
        }
    }
}


import flash.display.Shape;
import flash.events.Event;

//Shape 을 상속 [과제2] 
class nonBlockingLoop extends Shape
{
    private var  _this : nonBlockingLoop;
    
    //** 변경된 내용 : 기존의 ...$param을  Array 형태로 전환하여 후자에 인자값을 더 받을수 있게 하였다
    //** $completeCallBack 을 만들어 루프 완료시 신호를 전달하게 하였다.
    //** 인자 기본값을 = null 로 하여 필요없을때는 비워두도록 하였다.
    public function loop( $counter : int , $limit : int , $runner:Function , 
                          $param : Array = null , 
                          $completeCallBack : Function = null):void
    {
        var counter : int = 0;
        
        //상속된 Shape 의 참조를 유지하기 위해
        _this = this;
        _this.addEventListener(Event.ENTER_FRAME , 
            function(e:Event):void
            {
                var i : int = 0;
                while( i++ < $limit)
                {
                    if(counter < $counter)
                    {
                        //$param 의 null 검사 추가
                        if($param != null && $param.length)
                        {
                            $runner.apply( null , $param);
                        }else{
                            $runner();
                        }
                        ++counter;
                    }else{
                        
                        //완료시.. 콜백호출[과제1] 
                        if($completeCallBack != null)
                            $completeCallBack();
                        _this.removeEventListener(e.type , arguments.callee );
                        break;
                    }
                }
            }
        );
    }
}


*3. : 
http://www.diebuster.com/?s=%EB%A3%A8%ED%94%84&x=0&y=0#/?p=1559






** p.s

nonBlockingLoop 클래스 의 인자값 , [ $counter : int , $limit : int ] 를 좀더 편리하게 바꾸어 실제 연산되는 양을 직접적으로 기입할수 있게
한다면 경우에 따라 사용성이 훨씬 높아 질것 같다는 생각을 했습니다.

기능추가를 위해 루프안에다가 제어문의 내용을 늘리면 퍼포면스 영향이 약간 걱정되기도 합니다.

테스트 루프 기능을 추가하여, 몇번루프를 돌릴면서 시간차를 체크하면 , 해당 클라이언트의 컴퓨터 속도를 
도출할수 있어 루프의 연산 밀도를 조절할수 있을것도 같습니다.
Yamecoder 야매코더_
AS3 2011.02.10 10:37
Powerd by Tistory, designed by criuce
rss