Swift UI测试:实现AccessToken获取的5次重试循环方案问询
问题场景
在UI测试流程中,我们通过传参让应用调用API创建新用户,获取用户的AccessToken后以登录态启动应用。但后端存在AccessToken就绪延迟问题,耗时波动极大——有时仅需毫秒级,有时会超过1秒。需要为获取AccessToken的操作添加最多5次、每次间隔1秒的重试逻辑。
现有代码与函数签名
原代码片段:
guard let accessToken = try? await UITestsNetwork.shared.autoLogin(email: credentials.email, password: credentials.password).async() else { return } intializeLogin(with: accessToken)
autoLogin函数签名:
autoLogin(email: String, password: String) -> AnyPublisher<AccessToken, Error>
解决方案代码
以下是符合需求的Swift异步重试实现:
var accessToken: AccessToken? let maxRetries = 5 for attempt in 0..<maxRetries { do { accessToken = try await UITestsNetwork.shared.autoLogin(email: credentials.email, password: credentials.password).async() break // 成功获取token,跳出循环 } catch { print("第\(attempt + 1)次获取AccessToken失败:\(error.localizedDescription)") if attempt < maxRetries - 1 { // 非最后一次失败,等待1秒后重试 try? await Task.sleep(nanoseconds: 1_000_000_000) Task.yield() } } } guard let token = accessToken else { print("已尝试\(maxRetries)次,仍无法获取AccessToken") return } intializeLogin(with: token)
代码说明
- 用
for循环严格控制最多5次重试,成功获取token后立即跳出循环 - 使用
Task.sleep替代阻塞式sleep,避免占用异步线程(注意参数单位为纳秒) - 仅在非最后一次失败时执行等待逻辑,减少不必要的延迟
- 每次失败打印错误详情,方便测试调试
- 最终校验token是否获取成功,失败则直接返回,成功则初始化登录流程
内容的提问来源于stack exchange,提问作者destr
相关产品推荐
相关产品推荐

