LNDelayTask.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. //
  2. // LNDelayTask.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/6.
  6. //
  7. import Foundation
  8. class LNDelayTask {
  9. // 保存任务实例,用于取消
  10. private static let lock = NSLock()
  11. private static var workItems: [String: DispatchWorkItem] = [:]
  12. /// 执行延时任务(可取消)
  13. /// - Parameters:
  14. /// - delay: 延时秒数
  15. /// - queue: 执行队列(默认主线程)
  16. /// - task: 延时后执行的任务
  17. @discardableResult
  18. static func perform(delay: TimeInterval, queue: DispatchQueue = .main, task: @escaping () -> Void) -> String {
  19. // 创建任务
  20. let uuid = UUID().uuidString
  21. let workItem = DispatchWorkItem(block: {
  22. lock.lock()
  23. workItems.removeValue(forKey: uuid)
  24. lock.unlock()
  25. task()
  26. })
  27. lock.lock()
  28. workItems[uuid] = workItem
  29. lock.unlock()
  30. // 延时执行
  31. queue.asyncAfter(deadline: .now() + delay, execute: workItem)
  32. return uuid
  33. }
  34. /// 取消延时任务
  35. static func cancel(key: String?) {
  36. guard let key else { return }
  37. lock.lock()
  38. defer {
  39. lock.unlock()
  40. }
  41. guard let task = workItems.removeValue(forKey: key) else {
  42. return
  43. }
  44. task.cancel()
  45. }
  46. }