Swift Alamofire嵌套请求出现Error -999问题求助
嘿,咱们一步步来解决你遇到的Alamofire问题——Error -999错误、跨请求保留Cookie,还有那个可选的第二个请求的处理:
1. 先搞定Error -999的核心原因
Error -999在Alamofire里基本都是会话对象被提前回收导致的。看你的代码,sessionManager是定义在请求闭包内部的局部变量,当第一个请求的闭包执行完,这个会话管理器可能会被ARC自动释放,后续发起第二个请求时就会直接取消并抛出-999错误。
所以第一步,把sessionManager提升为全局变量或者类的属性,确保它的生命周期覆盖所有请求:
// 比如在你的ViewController里,把sessionManager定义为类属性 class YourViewController: UIViewController { // 类级别的会话管理器,保证生命周期足够长 private let sessionManager: Alamofire.SessionManager = { let configuration = URLSessionConfiguration.default // 默认开启Cookie自动管理,后续请求会自动携带 configuration.httpCookieAcceptPolicy = .always return Alamofire.SessionManager(configuration: configuration) }() // 登录请求方法 func sendLoginRequest(params: [String: Any]) { sessionManager.request(NSLocalizedString("url_login", comment: ""), method: .post, parameters: params).response { response in if response.response?.statusCode == 200 { // 登录成功后,根据需求发起可选的第二个请求 self.sendOptionalSecondRequest() } else { // 处理登录失败逻辑 } } } }
2. 确保Cookie在会话中自动保留
Alamofire的SessionManager默认会通过URLSessionConfiguration自动管理Cookie,只要你用同一个sessionManager发起所有请求,第一个请求获取的Cookie就会被自动保存,并在后续请求中自动携带。如果需要更精细的控制,可以手动配置Cookie存储:
// 初始化sessionManager时手动配置Cookie存储 private let sessionManager: Alamofire.SessionManager = { let configuration = URLSessionConfiguration.default // 绑定系统默认的Cookie存储容器 configuration.httpCookieStorage = HTTPCookieStorage.shared configuration.httpCookieAcceptPolicy = .always return Alamofire.SessionManager(configuration: configuration) }()
3. 处理可选的第二个请求
因为第二个请求是可选的,你可以在登录成功后加条件判断是否发起,同时要确保用同一个sessionManager,并处理可能的错误:
func sendOptionalSecondRequest() { // 这里根据你的业务逻辑判断是否需要发起请求 guard needToSendSecondRequest() else { return } sessionManager.request("你的第二个请求URL", method: .get).response { response in switch response.result { case .success(let data): // 处理第二个请求的成功结果 print("第二个请求成功,返回数据:\(data ?? Data())") case .failure(let error): if (error as NSError).code == -999 { print("第二个请求被取消,大概率是会话管理器被提前释放了,检查下sessionManager的生命周期") } else { print("第二个请求失败:\(error.localizedDescription)") } } } } // 示例:判断是否需要发起第二个请求的逻辑 func needToSendSecondRequest() -> Bool { // 比如根据用户配置、业务状态返回true/false return true }
额外排查小Tips
- 如果还是出现-999,检查是否在发起第二个请求前,
sessionManager被意外置为nil或者销毁了 - 确认第二个请求的URL、参数没有问题,排除网络切换、用户主动取消等其他导致请求取消的因素
内容的提问来源于stack exchange,提问作者AlexP
相关产品推荐
相关产品推荐

