throttle( x, latest = true)
- 주로 버튼의 중복 입력 방지에 사용된다.
- latest 의 기본값은 true이다.
코드
let input = EditProfileViewModel.Input(
imageViewButtonTapped: profileImageView.button.rx.tap
.throttle(.seconds(10), scheduler: MainScheduler.asyncInstance),
이렇게 설정하게 되면 Input으로 첫 Event가 발생하면 Event를 방출하고 10초동안 무시한 뒤 10초가 지나면 가장 마지막이벤트를 전달한다.
물론 1개의 이벤트만 발생했다면 최초 1개의 이벤트만 방출한다.
let input = EditProfileViewModel.Input(
settingButtonTap: settingButtonTapSubject
.throttle(.seconds(10), latest: false, scheduler: MainScheduler.asyncInstance)
latest = false로 설정하게 되면 첫 번째 이벤트가 발생하고 10초동안의 이벤트를 무시한다.
언제나 글은 어려우니 쉽게 ..
* latest = true
* latest = false
MVVM의 InOut 패턴을 구현할 당시 셀위에에 존재하는 버튼(이미지뷰)를 뷰모델에 바인딩 해야하는데 RxDataSource를 활용해 컬렉션뷰를 만들던 중 셀에 바인딩이 여러번되어 nextEvent를 여러번 전달하게되는 이슈가 발생했다.
같은 이벤트의 전달로 같은 동작을 반복하게 되므로 이 문제를 해결해야 했는데 이 때 적용한 방법이 throttle이다.
Debounce(x)
- timer로 지정된 x동안 새로운 이벤트가 발생하면 이전이벤트는 무시되고 Timer가 초기화된다.
- Debounce는 반대로 x동안 무시하다가 마지막으로 발생한 이벤트를 방출한다.
- 이벤트 시작과 동시에 timer가 작동되지만, timer 내에 다른 이벤트가 없어야 마지막 이벤트 발생시점부터 x 시간이 흐른 후 이벤트가 방출된다.
- 유저의 마지막 이벤트를 기다리는 느낌?
여전히 말은 어려우니 그림으로 보자 !
사용 예시 )
SearchBar가 있다고 해보자.. 유저가 한글자 한글자 입력할 때 마다 계속 검색을 위해 API콜을 한다면 리소스 낭비가 심할것이다.
a..ap..app...appl....apple...
apple을 검색하기 위해 5번의 API콜을 하게된다.
반면 Debounce를 활용해서 유저가 0.5 내에 발생시킨 마지막 이벤트만 검색을 한다면?
0.5초에 3타를 칠수있는 유저라 가정하자!
app....apple
apple을 검색하기 위해 2번의 API콜이면 충분하다
아이패드로 글씨쓰기 어렵네요..!