티스토리 뷰

프로그래밍/잡탕

Runtime Event Listener 관련 문제사항

터프 프로그래머 2012. 2. 1. 00:48
Runtime Event로 자주 사용하는 "touch" 이벤트와 "enterFrame" 이벤트를  add, remove하는 것에서 문제를 발견하였습니다.
먼저 소스를 첨부하겠습니다.

  


local enterFrame1, enterFrame2

local touch1, touch2

local release1, release2


local release1 = function()

print ("release1")

--Not OK

--Runtime:removeEventListener( "touch", touch1 )

end


local release2 = function()

print ("release2")

--Not OK

--Runtime:removeEventListener( "touch", touch2 )

end


local enterFrame1 = function( event )

print ("enterFrame1")

end


local enterFrame2 = function( event )

print ("enterFrame2")

end


local touch1 = function( event )

if event.phase == "began" then 

--OK

Runtime:removeEventListener( "enterFrame", enterFrame1 )

print ("touch1 began")

end

if event.phase == "ended" then

--OK

Runtime:removeEventListener( "enterFrame", enterFrame2 )

--Not OK

--Runtime:removeEventListener( "touch", touch2 )

timer.performWithDelay( 1000, release1 )

print ("touch1 ended")

end

end


local touch2 = function( event )

if event.phase == "began" then

print ("touch2 began")

end

if event.phase == "ended" then

--Not OK

--Runtime:removeEventListener( "touch", touch2 )

timer.performWithDelay( 1000, release2 )

print ("touch2 ended")

end

end


Runtime:addEventListener( "enterFrame", enterFrame1 )

Runtime:addEventListener( "enterFrame", enterFrame2 )


Runtime:addEventListener( "touch", touch1 )

Runtime:addEventListener( "touch", touch2 )


-- OK

--Runtime:removeEventListener( "touch", touch1 )

--Runtime:removeEventListener( "touch", touch2 )


print ( Runtime:hasEventSource( enterFrame1 ) )

 
추가한 주석을 함께 보시면, 등록한 "touch" 리스너 내부에서는 "touch" 리스너가 삭제가 되지 않는데
외부에서 삭제를 시도할 경우 잘 된다는 것을 알 수 있습니다.
직접 시뮬레이터에 넣어 돌려보셔도 됩니다.

현재 제가 터치 리스너 내부에서 터치리스너를 삭제를 해야하는데....
이렇게 터치 리스너 내부에서 삭제를 할 수가 없으니 굉장히 큰 문제입니다.
사실 저도 어떻게 해결을 해야할지 모르겠어서 혹시 도움을 받을 수 있을까 이렇게 포스트로 남깁니다.
해결방법을 찾으면 해결방법을 설명하는 포스트로 수정하도록 하겠습니다. 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday