티스토리 뷰

일정시간 이후에 실행하도록 하는 것은 여기저기에서 많이 사용되는터라 클래스로 만들어봤습니다.
간단한 기능만 넣어 아주 단순하게 만들었습니다.

사용법은 아주 간단합니다.

해당 클래스를 import 한 뒤에 Later.regist() 함수로 실행할 함수와 시간을 지정하면 됩니다. 해제는 Later.unregist() 를 호출하면 됩니다. 그리고 당연히 이미 실행된 경우에는 실행취소는 불가합니다;


사용예

import lib.utils.Later;

Later.regist(3000, testMessage, "testid", 100, 200, "test string");
//Later.unregist("testid");// 해제

function testMessage(a:int, b:int, c:String):void
{
	trace(a, b, c);// 결과 100 200 test string
}

Later Class
/**
 * Later
 *
 * 기본적인 기능은 설정한 지연시간 이후에 함수 실행하는 것이고, new 키워드로 새로운 객체를
 * 생성하지 않고도 static Later 클래스를 이용해 쉽게 실행할 함수를 등록/해제 가능.
 *
 * <사용법>
 *
 * Later.regist(3000, showMessage, "test", 100, 200, "test string");
 * function showMessage(a:int, b:int, c:String):void
 * {
 *     trace(a, b, c);
 * }
 *
 *
 * @package		lib.utils.Later
 * @author		Sim Hee-Jae  (http://kais.tistory.com/)
 * @copyright	Copyright (c) 2010-2011
 * @version		0.2 (20110129)
 * @license		MIT License
 */
package lib.utils
{
	// {{[

	import flash.events.DataEvent;
	import flash.events.TimerEvent;
	import flash.utils.Dictionary;
	import flash.utils.Timer;

	// }}}
	// {{{

	[Event(name="onLaterComplete", type="flash.events.DataEvent")]

	// }}}
	// {{{

	public class Later
	{
		// {{{ Properties

		/** @private ** container **/
		static private var _laters :Dictionary	= new Dictionary(false);

		/** @private ** container **/
		static private var _keyindex :uint		= 0;

		// }}}
		// {{{ Methods

		public function Later()
		{
		}

		/**
		 * 새로운 콜백함수 등록. 지연시간, 콜백함수, ID 값을 인자로 받고, 추가적으로 콜백함수로 넘길
		 * 파라메터를 받을 수 있다. 파라메터는 순서대로 나열해주면 콜백함수로 그대로 넘겨진다.
		 *
		 * @param	(Number)		delay						지연시간
		 * @param	(Function)		callback					실행할 함수
		 * @param	(String)		id				(optional)	콜백함수를 구분할 ID. (사용자 지정)
		 *                                                      실행을 취소할 때 필요
		 * @param	(...args)		parameters		(optional)	콜백함수로 넘길 인자들
		 * @return	(void)
		 */
		static public function regist(delay:Number, callback:Function, id:String = null, ... args):void
		{
			// [2011-01-29] ADDED: ID를 지정하지 않을 경우 임시 ID 생성
			if (id == null) {
				id = "__temporary_later__"+ String(_keyindex++);
			}

			if (_laters.hasOwnProperty(id) == true) {
				unregist(id as String);
			}

			_laters[id] = new LaterContainer(delay, callback, id, args);
			_laters[id].addEventListener("onLaterComplete", onLaterEvent);
		}

		/**
		 * 등록된 콜백함수를 삭제. 해당 ID의 함수는 실행을 취소하고 삭제된다.
		 * (단, 이미 실행된 경우는 실행취소는 불가)
		 *
		 * @param	(String)		id							삭제할 대상의 ID
		 * @return	(void)
		 */
		static public function unregist(id:String):void
		{
			if (_laters.hasOwnProperty(id) == true) {
				_laters[id].destroy();
			}
		}

		/**
		 * Later 클래스의 콜백함수 목록에서 해당 객체를 삭제하기 위해 콜백함수가 실행이 되거나 취소된 경우
		 * "onLaterComplete" 이벤트를 발생하여 ID를 넘겨준다.
		 *
		 * @param	(DataEvent)		e							이벤트 정보
		 * @return	(void)
		 */
		static private function onLaterEvent(e:DataEvent):void
		{
			var id :String = e.data;

			_laters[id].removeEventListener("onLaterComplete", onLaterEvent);
			delete _laters[id];
		}

		// }}}
	}// END: class

}// END: package


// --- LaterContainer Class ---------------------------------------------------------------------

import flash.events.DataEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;

class LaterContainer extends Timer
{
	// {{{ Properties

	/** @private ** Later ID **/
	private var _id :String;

	/** @private ** 콜백함수 **/
	private var _callback :Function;

	/** @private ** 인자값 **/
	private var _params :Array;

	// }}}
	// {{{ Methods 

	/**
	 * 지정된 지연시간 이후에 함수 실행. 객체 생성시 넘겨진 인자값이 있다면,
	 * 인자값을 사용하여 함수를 호출
	 *
	 * @param	Number		delay						지연시간 (1/1000 초)
	 * @param	Function	callback					실행할 함수
	 * @param	String		id							아이디
	 * @param	Array		param			(optional) 	실행시 넘겨줄 인자값들
	 */
	public function LaterContainer(delay:Number, callback:Function, id:String, params:Array = null)
	{
		super(delay, 1);

		_id			= id;
		_callback	= callback;
		_params		= params;

		addEventListener(TimerEvent.TIMER_COMPLETE, onComplete, false, 0, true);
		start();
	}

	/**
	 * 타이머 해제
	 *
	 * @return	void
	 */
	public function clear():void
	{
		removeEventListener(TimerEvent.TIMER_COMPLETE, onComplete);
		stop();
	}

	/**
	 * LaterContainer 삭제
	 *
	 * @return	void
	 */
	public function destroy():void
	{
		clear();
		dispatchEvent(new DataEvent("onLaterComplete", false, true, _id));
	}

	/**
	 * 타이머가 완료되면 호출되며, 여기서 지정한 함수를 인자와 함께 호출함
	 *
	 * @param	(TimerEvent)	evt						타이머 이벤트
	 * @return	(void)
	 */
	private function onComplete(evt:TimerEvent):void
	{
		// [2011-01-29] FIXED: 인자값 여부 검사
		// 인자값이 있다면 apply() 함수로, 없다면 call() 함수 실행
		if (_params != null && _params.length > 0) {
			_callback.apply(_callback, _params);
		} else {
			_callback.call(_callback);
		}

		destroy();
	}

	/**
	 * Get ID
	 *
	 * @return	(String)								LaterContainer 의 ID
	 */
	public function get id():String { return _id; }

	// }}}
}// END: class
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함