Skip to content

Instantly share code, notes, and snippets.

@jimmythai
Created April 21, 2019 12:46
Show Gist options
  • Save jimmythai/71af0e6c4b37a90478f14bae70eae3f2 to your computer and use it in GitHub Desktop.
Save jimmythai/71af0e6c4b37a90478f14bae70eae3f2 to your computer and use it in GitHub Desktop.
class Throttler {
private let delay: DispatchTimeInterval
private let queue: DispatchQueue
private var previousFiredTime: DispatchTime = .now()
init(delay: DispatchTimeInterval, queue: DispatchQueue = .main) {
self.delay = delay
self.queue = queue
}
func throttle(_ block: @escaping () -> Void) -> Void {
queue.asyncAfter(deadline: .now() + delay) { [weak self, delay] in
guard let self = self else { return }
let minimumDelay = self.previousFiredTime + delay
if .now() < minimumDelay { return }
self.previousFiredTime = .now()
block()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment