В чем разница между Debounce и Throttle (Delay) при обработке событий?

«В чем разница между Debounce и Throttle (Delay) при обработке событий?» — вопрос из категории Реактивное программирование, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 */ }