如何取消特定的DispatchQueue.main.asyncAfter事件?适配当前Swift版本
如何取消Swift中的
DispatchQueue.main.asyncAfter定时任务? 我太懂你翻遍旧帖却找不到合适方案的苦恼了——要么是适配老版本Swift的过时写法,要么就是答案绕来绕去不够简洁。针对你给出的场景,现在Swift里最靠谱且简洁的解决方式是用DispatchWorkItem来封装定时任务,具体操作看下面:
实现步骤
- 封装任务逻辑:把你原本要放在
asyncAfter闭包里的代码,打包到一个DispatchWorkItem实例中 - 提交定时任务:通过
asyncAfter提交这个WorkItem,替代直接传入闭包的写法 - 按需取消任务:在需要取消的时机,调用WorkItem的
cancel()方法即可
示例代码
// 1. 创建要延迟执行的任务 let targetTask = DispatchWorkItem { // 这里写你原本要延迟2秒执行的代码 print("这段代码会被取消,不会打印出来") } // 2. 提交定时任务(延迟2秒执行) DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: targetTask) // 3. 在需要取消的地方调用cancel(),比如按钮点击、状态变更时 targetTask.cancel()
额外注意点
- 如果调用
cancel()时任务还没到执行时间,它就永远不会被触发 - 如果任务已经开始执行,
cancel()无法中断正在运行的代码,这时候可以在闭包开头加个判断,避免无效执行:let targetTask = DispatchWorkItem { guard !targetTask.isCancelled else { return } // 后续业务代码 }
内容的提问来源于stack exchange,提问作者user9174501
相关产品推荐
相关产品推荐

