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

Swift Async/Await实现断网等待重连后重试请求的方案问询

解决方案:Async/Await 下的网络重试逻辑

核心思路是把原有的「任务队列缓存」改成「异步挂起等待」模式——当遇到网络错误时,让当前异步任务挂起,直到网络恢复后自动重试请求。

1. 实现异步等待网络恢复的方法

我们需要将网络恢复的监听逻辑转成异步可等待的操作,这里用withCheckedThrowingContinuation把通知回调转换为异步等待:

private func waitForNetworkRestoration() async throws {
    let networkRestoredNotification = NSNotification.Name("NetworkRestored")
    
    try await withCheckedThrowingContinuation { continuation in
        // 注册网络恢复通知监听
        let observer = NotificationCenter.default.addObserver(
            forName: networkRestoredNotification,
            object: nil,
            queue: .main
        ) { _ in
            continuation.resume()
            NotificationCenter.default.removeObserver(observer)
        }
        
        // 处理任务取消:若当前任务被取消,终止等待并抛出取消错误
        Task {
            await Task.yield()
            if Task.isCancelled {
                NotificationCenter.default.removeObserver(observer)
                continuation.resume(throwing: CancellationError())
            }
        }
    }
}

2. 修改getData()实现重试逻辑

用循环替代递归(可读性更强,避免异步递归的隐式调用栈问题),遇到网络错误时等待恢复后自动重试:

func getData() async throws -> SomeData {
    while true {
        let result = await apiService.getSomeData()
        
        switch result {
        case .success(let data):
            return data
        case .failure(let error):
            switch error {
            case .networkError:
                // 等待网络恢复后继续循环重试
                try await waitForNetworkRestoration()
            default:
                // 非网络错误直接抛出
                throw error
            }
        }
    }
}

3. 适配网络恢复的触发逻辑

原来的onConnectionToTheInternetRestored方法需要改为发送通知,唤醒所有处于等待状态的异步任务:

private func onConnectionToTheInternetRestored() {
    NotificationCenter.default.post(
        name: NSNotification.Name("NetworkRestored"),
        object: nil
    )
}

关键注意事项

  • 任务取消处理:必须处理任务取消场景,避免用户退出页面后,任务仍在后台无限等待网络恢复。
  • 通知准确性:确保网络恢复通知仅在网络真正恢复时发送,避免重复触发不必要的重试。
  • 重试次数限制:如果需要限制重试次数,可以在循环中加入计数器,达到上限后抛出错误终止重试。

内容的提问来源于stack exchange,提问作者akex jeer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:10:48