[iOS] Combine - throttle, debounce

Zoe·2023년 12월 26일
0

iOS

목록 보기
35/39

throttle, debounce 는 모두 이벤트 스트림을 제어하여 과도한 업데이트를 방지하고, 성능을 개선하는 데 사용된다.

예시와 함께 알아보자.

searchTextField.publisher
    .throttle(for: .seconds(1), scheduler: DispatchQueue.main, latest: true)
    .sink { [unowned self] in self.search($0) }
    .store(in: &subscriptions)

사용자가 TextField에 Text를 입력할 때, 각 Text가 입력될 때마다 검색을 실행하지 않고, 1초 간 간격을 두고 검색을 실행하는 예시이다. 사용자가 타이핑하는 동안 네트워크 요청의 수를 제한하고 싶을 때 유용하다.

throttle은 지정된 시간 간격 동안 이벤트 스트림에서 첫 번째 이벤트를 전달한 후, 이후의 모든 이벤트를 무시한다. 이 시간 동안에 들어오는 추가적인 이벤트는 무시되고, 시간 간격이 지난 후에 들어오는 첫 번째 이벤트만이 다시 전달된다.

searchTextField.publisher
    .debounce(for: .seconds(0.5), scheduler: DispatchQueue.main)
    .sink { [unowned self] in self.search($0) }
    .store(in: &subscriptions)

사용자가 TextField에 Text를 입력하고, 입력이 멈춘 후 0.5초 지난 후에 검색을 실행하는 예시이다. 사용자가 타이핑을 완료했을 때만 검색을 실행하려고 할 때 유용하다.

debounce는 지정된 시간 간격 동안 이벤트가 더 이상 발생하지 않을 때까지 기다린다. 이 시간 동안 추가 이벤트가 발생하면 타이머를 리셋한다. 즉, 연속된 이벤트 스트림에서 마지막 이벤트만을 전달한다.

결론
throttle : 지정된 시간 간격마다 최대 한 번의 이벤트를 전달한다. 이는 "일정 시간 동안 최소한 이만큼의 시간이 지나야 다음 이벤트를 받겠다"는 의미.
debounce : 이벤트 스트림이 일정 시간 동안 정지되었을 때만 이벤트를 전달한다. 이는 "이벤트가 멈춘 후 이만큼 시간이 지나야 다음 이벤트를 받겠다"는 의미.
🌟 throttle, debounce 모두 사용자 입력과 같은 빠르게 발생하는 이벤트를 처리할 때 유용하며, 네트워크 요청 등을 제어

profile
iOS 개발자😺

0개의 댓글