Научитесь давать вызовам вашего метода некоторое пространство для передышки между выполнением
Что такое отключение вызова метода?
Отказ от вызова метода гарантирует, что метод не будет выполняться слишком часто.
Например: если вы видите базовую реализацию представления поиска в любом приложении, оно не выполняет HTTP-вызов к серверной части для каждого вводимого вами символа. Это приведет к множеству HTTP-вызовов, и в большинстве из них нет необходимости.
Вместо этого мы используем нечто, называемое Debouncer
, которое вызывает определенный метод только через заданный интервал времени. Для примера поиска, если у нас есть ограничение по времени 0,3 секунды, тогда HTTP-вызов для получения результатов поиска будет выполнен, когда пользователь ничего не наберет в течение 0,3 секунды. Если пользователь продолжает вводить текст без паузы в течение 0,3 секунды, временной интервал обновляется при каждом нажатии клавиши.
Реализация настраиваемого дебаунсера
Давайте разберемся, как это реализовано!
Line 3
: Это временной интервал дебаунсера. Если за этот промежуток времени не было предпринято никаких действий, будет вызван метод.
Line 4
: Мы используем таймер, чтобы убедиться, что метод не вызывается до истечения временного интервала.
Line 6,7
: Это закрытие обработчика, которое будет вызываться по окончании временного интервала. Внутри этого закрытия мы можем реализовать код для запуска или код, который нужно отладить.
Line 9
: это настраиваемая инициализация, которая принимает временной интервал в качестве параметра. У нас не может быть инстанса противодействия без временного интервала
Line 13
: Метод обновления интервала используется для обновления интервала времени устранения дребезга. Если пользователь нажимает десять клавиш без паузы, интервал будет обновляться десять раз, чтобы убедиться, что мы проверяем временной интервал с момента последнего действия пользователя. Каждый раз, когда вызывается этот метод, мы создаем новый Timer
, который будет вызывать функцию по истечении интервала времени.
Line 20
: этот метод вызывается, когда Timer
завершает временной интервал. В свою очередь, мы вызовем handler
, который отвечает за выполнение кода устранения неполадок.
Использование Debouncer
Line 3
: Мы создали экземпляр Debouncer
с временным интервалом 0.3 seconds
.
Line 25
: doSomething
- это метод, который мы планируем устранить. Каждый раз, когда интервал обновляется, он будет распечатывать renew interval
, и всякий раз, когда метод выполняется внутри обработчика, он распечатывает method executed
.
Line 5
: Мы вводим действия пользователя в viewDidLoad
с помощью DispatchQueue
Мы вызываем метод doSomething()
три раза после интервала 0.1 seconds
. Временной интервал больше, чем 0.1 seconds
, поэтому обработчик не будет выполняться, вместо этого противодействует обновлению интервала три раза.
Затем следует пауза 0.4 seconds
- больше, чем временной интервал отладчика, поэтому он выполнит обработчик. После этого Line 18
снова обновляет интервал и выполняет обработчик после 0.3 seconds
.
Результат будет выглядеть так:
Заключение
Это была базовая реализация Debouncer
. Есть много разных способов реализовать одно и то же - все они верны, если соответствуют вашим требованиям.
Вы можете найти образец проекта на Github.