You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:22:45