如何修改Swift异步函数以实现取消操作的传播?
取消操作传播的修改方案
当前的loadResource函数未响应任务取消信号,导致外部Task的取消操作无法传递到内部的load()调用及后续流程中。要实现取消操作的传播,需在函数中主动检查任务取消状态,确保取消信号能中断执行流程。
修改方法
在loadResource中插入try Task.checkCancellation()调用——这个方法会在当前任务已取消时立即抛出CancellationError,直接中断后续操作:
func loadResource() async throws -> Resource { // 执行异步操作前检查取消状态,提前终止流程 try Task.checkCancellation() let data = try await load() // 解码前再次检查,避免取消后执行不必要的解码操作 try Task.checkCancellation() return try decoder.decode(Resource.self, from: data) }
额外说明
修改后,外部Task的取消信号会完整传播到loadResource内部:
- 如果任务在
load()执行前被取消,会直接抛出取消错误,不会触发load()调用 - 如果任务在
load()执行过程中被取消,只要load()本身是支持取消的异步函数(比如基于URLSession的网络请求,原生支持响应Task取消),也会抛出错误中断执行 - 原Task代码里手动检查
Task.isCancelled的逻辑可以移除,因为try await service.loadResource()会自动在取消时抛出错误,简化后的Task代码如下:
let task = Task<Service.Resource, Error> { return try await service.loadResource() }
内容的提问来源于stack exchange,提问作者bobby123uk
相关产品推荐
相关产品推荐

