Одна из распространенных проблем, которую люди склонны недооценивать, — это когда пользователи решают нагрузить тяжелую функциональность в вашем приложении, например, нажимая на кнопку множество раз за небольшой промежуток времени, что приводит к сбоям и неопределенному поведению.
Один из способов преодолеть эту проблему — создать таймер отбоя. Для этого мы определим пару переменных внутри класса, в котором используется функциональность:
private var debouncingTimer: Timer? = nil
private let DEBOUNCE_TIME: TimeInterval = 0.5
Время отбоя — это минимальный интервал времени, в течение которого должен произойти тяжелый код. В течение этого промежутка времени другие действия пользователя будут игнорироваться.
Затем, находясь внутри розетки кнопки, которая запускает вашу тяжелую функциональность, мы выполняем следующее:
if debouncingTimer == nil || debouncingTimer?.isValid == false {
self.debouncingTimer = Timer.scheduledTimer(
withTimeInterval: DEBOUNCE_TIME,
repeats: false) { [weak self] timer in
timer.invalidate()
self?.debouncingTimer = nil
}
// your heavy functionality
}
Делая это, мы устанавливаем таймер каждый раз, когда срабатывает тяжелый код, и защищаем его до тех пор, пока таймер продолжает работать.
Когда таймер срабатывает, функциональность снова становится доступной для пользователя.