1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
// // DebounceViewController.swift // UpgradeMySelf-ios // // Created by Shubham Sharma on 06/05/22. // Copyright © 2022 Shubham Sharma. All rights reserved. // import UIKit class DebounceViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() tabBarItem.tag = TabbarItemTag.secondViewConroller.rawValue view.backgroundColor = .red let debouncedFunction = debounce(interval: 200, queue: DispatchQueue.main, action: { (identifier: String) in print("called: \(identifier)") }) debouncedFunction("1") DispatchQueue.global(qos: .background).async { debouncedFunction("1") usleep(100 * 1000) debouncedFunction("2") usleep(100 * 1000) debouncedFunction("3") usleep(100 * 1000) debouncedFunction("4") usleep(300 * 1000) // waiting a bit longer than the interval debouncedFunction("5") usleep(100 * 1000) debouncedFunction("6") usleep(100 * 1000) debouncedFunction("7") usleep(300 * 1000) // waiting a bit longer than the interval debouncedFunction("8") usleep(100 * 1000) debouncedFunction("9") usleep(100 * 1000) debouncedFunction("10") usleep(100 * 1000) debouncedFunction("11") usleep(100 * 1000) debouncedFunction("12") } } typealias Debounce<T> = (_ : T) -> Void func debounce<T>(interval: Int, queue: DispatchQueue, action: @escaping Debounce<T>) -> Debounce<T> { var lastFireTime = DispatchTime.now() let dispatchDelay = DispatchTimeInterval.milliseconds(interval) return { param in lastFireTime = DispatchTime.now() let dispatchTime: DispatchTime = DispatchTime.now() + dispatchDelay queue.asyncAfter(deadline: dispatchTime) { let when: DispatchTime = lastFireTime + dispatchDelay let now = DispatchTime.now() if now.rawValue >= when.rawValue { action(param) } } } } } |
warningComments are closed.