damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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 }