| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- //
- // LNDelayTask.swift
- // Lanu
- //
- // Created by OneeChan on 2025/11/6.
- //
- import Foundation
- class LNDelayTask {
- // 保存任务实例,用于取消
- private static let lock = NSLock()
- private static var workItems: [String: DispatchWorkItem] = [:]
-
- /// 执行延时任务(可取消)
- /// - Parameters:
- /// - delay: 延时秒数
- /// - queue: 执行队列(默认主线程)
- /// - task: 延时后执行的任务
- @discardableResult
- static func perform(delay: TimeInterval, queue: DispatchQueue = .main, task: @escaping () -> Void) -> String {
- // 创建任务
- let uuid = UUID().uuidString
- let workItem = DispatchWorkItem(block: {
- lock.lock()
- workItems.removeValue(forKey: uuid)
- lock.unlock()
-
- task()
- })
- lock.lock()
- workItems[uuid] = workItem
- lock.unlock()
-
- // 延时执行
- queue.asyncAfter(deadline: .now() + delay, execute: workItem)
-
- return uuid
- }
-
- /// 取消延时任务
- static func cancel(key: String?) {
- guard let key else { return }
-
- lock.lock()
- defer {
- lock.unlock()
- }
- guard let task = workItems.removeValue(forKey: key) else {
- return
- }
-
- task.cancel()
- }
- }
|