Debouncer.swift (1305B)
1 // 2 // Debouncer.swift 3 // damus 4 // 5 // Created by William Casarin on 2023-02-15. 6 // 7 8 import Foundation 9 10 class Debouncer { 11 private let queue = DispatchQueue.main 12 private var workItem: DispatchWorkItem? 13 private var interval: TimeInterval 14 15 init(interval: TimeInterval) { 16 self.interval = interval 17 } 18 19 func debounce(action: @escaping () -> Void) { 20 // Cancel the previous work item if it hasn't yet executed 21 workItem?.cancel() 22 23 // Create a new work item with a delay 24 workItem = DispatchWorkItem { action() } 25 queue.asyncAfter(deadline: .now() + interval, execute: workItem!) 26 } 27 28 func debounce_immediate(action: @escaping () -> Void) { 29 guard self.workItem == nil else { 30 return 31 } 32 33 self.workItem = DispatchWorkItem(block: { 34 self.workItem = nil 35 }) 36 37 action() 38 queue.asyncAfter(deadline: .now() + interval, execute: self.workItem!) 39 } 40 41 func debounce_once(action: @escaping () -> Void) { 42 guard self.workItem == nil else { 43 return 44 } 45 46 self.workItem = DispatchWorkItem(block: { 47 self.workItem = nil 48 action() 49 }) 50 51 queue.asyncAfter(deadline: .now() + interval, execute: self.workItem!) 52 } 53 }