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
相关产品推荐
相关产品推荐

