MODelayTask.swift 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. //
  2. // MODelayTask.swift
  3. // MiMoLive
  4. //
  5. // Created by OneeChan on 2025/10/10.
  6. //
  7. import Foundation
  8. class MODelayTask {
  9. // 保存任务实例,用于取消
  10. private static var workItems = NSMapTable<NSString, DispatchWorkItem>.init(
  11. keyOptions: .strongMemory,
  12. valueOptions: .weakMemory
  13. )
  14. /// 执行延时任务(可取消)
  15. /// - Parameters:
  16. /// - delay: 延时秒数
  17. /// - queue: 执行队列(默认主线程)
  18. /// - task: 延时后执行的任务
  19. @discardableResult
  20. static func perform(delay: TimeInterval, queue: DispatchQueue = .main, task: @escaping () -> Void) -> String {
  21. // 创建任务
  22. let workItem = DispatchWorkItem(block: task)
  23. let uuid = UUID().uuidString
  24. workItems.setObject(workItem, forKey: uuid as NSString)
  25. // 延时执行
  26. queue.asyncAfter(deadline: .now() + delay, execute: workItem)
  27. return uuid
  28. }
  29. /// 取消延时任务
  30. static func cancel(key: String?) {
  31. guard let key else { return }
  32. guard let task = workItems.object(forKey: key as NSString) else {
  33. return
  34. }
  35. workItems.removeObject(forKey: key as NSString)
  36. task.cancel()
  37. }
  38. }