取消 DispatchQueue.main.asyncAfter 中的任务

要取消DispatchQueue.main.asyncAfter中的任务,可以使用DispatchWorkItem。首先,创建一个DispatchWorkItem实例,并将要执行的任务放入其中。然后,在调用DispatchQueue.main.asyncAfter方法之前,将该DispatchWorkItem实例与一个唯一的标识符进行关联,以便稍后可以取消任务。最后,如果需要取消任务,在适当的地方调用DispatchWorkItem.cancel()方法。
下面是一个示例代码:
// 创建一个 DispatchWorkItem
var workItem: DispatchWorkItem?

// 将要执行的任务放入 DispatchWorkItem
workItem = DispatchWorkItem {
    // 执行任务
    print("执行任务")
}

// 在 DispatchQueue.main 中延迟执行 DispatchWorkItem
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: workItem!)

// 取消任务
workItem?.cancel()
在这个示例中,任务将在5秒后执行。如果在调用DispatchQueue.main.asyncAfter之前调用了workItem.cancel()方法,那么任务将被取消,不会执行。
请注意,取消任务并不一定会立即停止任务的执行,它只会阻止任务继续执行下去。因此,如果任务正在执行某些长时间运行的操作,可能需要在任务的代码中检查是否已取消,并根据需要停止操作。
另外,如果要取消已经在执行的任务,可以尝试将任务的执行代码分解为多个小的操作,并在每个操作之间检查是否取消了任务(workItem?.isCancelled),以便在需要时立即停止任务的执行。注意在闭包中为 workItem 加上 weak 声明避免出现循环引用的问题。
 
你觉得这篇文章怎么样?
YYDS
比心
加油
菜狗
views

Loading Comments...