요즘 RxSwift를 이용한 프로젝트를 자주 접하고있는데 rx라는 익스텐션을 사용해 UI에 친화된 RxCocoa를 사용하던와중에 throttle, debounce를 사용할 일이 생겼고 이에 대해 정리하고싶어서 글을 쓰게되었다
보통 throttle과 debounce같은 경우에는 UITextField나 UIButton에 사용을 하는데 하나하나 알아보자
-> debounce는 인자로 타이머, 스케줄러 2가지를 받는다
-> 타이머는 시간을 지정, 스케줄러는 어떤 쓰레드를 사용할지를
-> debounce는 이벤트가 생기면 타이머가 초기화된다, 이게 무슨 말이냐면 처음 이벤트가 방출되고난 이후에 지정해준 시간에 대한 타이머가 흐르게되고 해당 시간이 지나게되면 다시 이벤트를 받을 수 있게되고 그 전에는 어떠한 이벤트를 방출하려해도 출력되지않는다
즉, debounce는 타이머에 대한 마지막 이벤트만 방출하는것이다
-> throttle은 타이머시간, latest, scheduler를 인자로 받는다
-> 여기서 latest가 true냐 false냐에 따라 방출되는 방식이 달라진다
-> throttle은 이벤트가 방출되어도 타이머가 초기화되지않는다
-> 이는 최신값을 받겠다는 의미로 타이머가 흐르는 도중에 어떠한 이벤트를 방출할 경우에 그에 대한 최신값을 타이머시간에 도달한 이후에 한번 더 방출하게된다
-> true일때와는 다르게 타이머시간이 흐르는 도중에 이벤트를 방출해도 타이머시간이 도다를때 따로 최신값을 방출하지않는다
debounce는 아무리 이벤트를 방출해도 타이머가 지나야만 또다시 이벤트를 받을 수 있는 특성을 고려해 API호출이나 UITextField에 query문을 쓰고 이에 대한 네트워킹을 해야할때 효율적일 것이다
throttle은 debounce처럼 계속 타이머가 초기화되지않는다는 특성을 고려해 UIButton에 tap에 대한 중복방지에 사용할 수 있을것이다, 물론 이도 debounce로 가능하겠지만 빠른 터치를 받아야하는 UIButton에 계속 타이머를 초기화하는 특성은 효율적이지 못할것이다