Ответ
Debounce и Throttle (часто путают с простым Delay) — операторы для контроля частоты событий, но с разной логикой.
- Debounce: Откладывает эмиссию события до тех пор, пока не пройдет заданный интервал (
dueTime) без новых событий. "Сбрасывает" таймер при каждом новом входном событии. Идеален для обработки пользовательского ввода (поиск). - Throttle: Пропускает первое (или последнее) событие в течение заданного интервала и игнорирует последующие. Не сбрасывает таймер. Полезен для обработки непрерывных действий (скролл, изменение размера).
- Delay: Простая задержка выполнения на фиксированное время, без логики "сброса" или "пропуска".
Визуализация (поток: A-B-C-D, интервал = 1с):
- Debounce (latest): Эмитит
D(через 1с после него, если новых событий не было). - Throttle (first): Эмитит
A, игнорирует B и C, затем эмититD. - Throttle (latest): Эмитит
A, игнорирует B и C, затем эмититD. - Delay: Эмитит
A(через 1с),B(через 1с), и т.д.
Пример Debounce в Combine (Swift):
searchTextField.publisher
.debounce(for: .milliseconds(500), scheduler: RunLoop.main)
.sink { query in /* Выполнить поиск */ }
Пример Throttle в Combine (Swift):
scrollViewPublisher
.throttle(for: .milliseconds(200), scheduler: RunLoop.main, latest: false)
.sink { /* Обновить UI */ }