Using …args as parameter for function to send data to amfPHP.
오늘 amfPHP에 NetConnection의 call 메서드로 변수를 보낼 때, 이를 좀더 편리하게 쓰기 위해 별도의 클래스를 만들기로 했었다. 이 클래스에서는 파라미터를 …args로 받아들여와 그대로 amfPHP로 보내고 싶었는데 이게 계속 애러가 났다. 반나절을 헤매다가 좀더 알아보니 NetConnection.call 메서드로 보내는 args(arguments)를 Actionscript에서는 하나의 파라미터로 인식해서 보내기 때문에 애러가 난다는 것이였다.
해결법으로 찾은 것은 Function 변수를 하나 만들어서 NetConnection의 call function 을 대입시켜준 뒤, 아래 코드와 같이 서비스클래스의 이름, Respond class 변수, arrgs에서 넘어온 녀석들을 차례대로 Array에 넣어준 다음 이를 Function.apply 메서드를 써서 변형시켜 적용하는 것으로 우선 결론을 내렸다. 이런식으로 문제를 해결하는 방법이 있음에 신기하달지… 참고로 처음에 시도했던 형태가 현재 마지막 부분에 주석처리 되어있는 _nc.call부분이다. 이렇게 데이터를 보내면 애러가 난다.
public function insertSqlData(serviceName:String, ...args:*):void { trace("------------------service name : ", serviceName); _serviceName = serviceName; _nc.connect(_gatewayPath); var reargs:Array = new Array; reargs.push(_serviceName); reargs.push(_res); for(var i:uint = 0; i < args.length; i++) { //args[i] = String(args[i] as Object); if(args[i] is Number) { trace(i, " is Number = ", args[i]); args[i] = String(args[i]); }else if(args[i] is String) { trace(i, " is String = ", args[i]); } reargs.push(args[i]); } var callFunction:Function = _nc.call; callFunction.apply(_nc, reargs); //_nc.call(_serviceName, _res, args); }
Related Links.
Daniel Eneström’s blog
ActionScript 3.0 References : flash_10, flash_9