NOTE: There is an updated version of this article for Swift 4.
Debouncing calls is great for situations where a repeating user action can cause network requests to happen. The problem is that the user’s actions can generate many requests in a short period of time, which can be slow to respond on a cellular network.
This also applies to other types of wireless communication, such as BLE.
Here is an implementation of a Debouncer class in Swift 3. Github Gist link
import Foundation
class Debouncer {
// Callback to be debounced
// Perform the work you would like to be debounced in this callback.
var callback: (() -> Void)?
private let interval: TimeInterval // Time interval of the debounce window
init(interval: TimeInterval) {
self.interval = interval
}
private var timer: Timer?
// Indicate that the callback should be called. Begins the debounce window.
func call() {
// Invalidate existing timer if there is one
timer?.invalidate()
// Begin a new timer from now
timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(handleTimer), userInfo: nil, repeats: false)
}
@objc private func handleTimer(_ timer: Timer) {
if callback == nil {
NSLog("Debouncer timer fired, but callback was nil")
} else {
NSLog("Debouncer timer fired")
}
callback?()
callback = nil
}
}
The Debounce class is straight forward to use:
// Create a Debouncer with a half-second time interval
let debouncer = Debouncer(interval: 0.5)
debouncer.callback = {
// Send the debounced network request here
print("Send network request")
}
func textDidChangeDelegateMethod() {
// When the user performs a repeating action, such as entering text, invoke the `call` method
debouncer.call()
}
PS: Interestingly, the term debounce comes from electrical engineering. “Bouncing is the tendency of any two metal contacts in an electronic device to generate multiple signals as the contacts close or open.” (http://whatis.techtarget.com/definition/debouncing) So a de-bouncing circuit cleans up this bouncing between the signals, by providing a single signal.
Subscribe to the newsletter to stay up to date with new articles.