Научитесь давать вызовам вашего метода некоторое пространство для передышки между выполнением

Что такое отключение вызова метода?

Отказ от вызова метода гарантирует, что метод не будет выполняться слишком часто.

Например: если вы видите базовую реализацию представления поиска в любом приложении, оно не выполняет 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.