双API请求完成后触发segue报Escaping closure相关错误如何解决
错误原因
所有报错的核心是 Swift 默认闭包参数为**非逃逸(non-escaping)**类型,仅允许在当前函数作用域内同步执行,而你将这些闭包传入了Alamofire的异步回调中——异步回调属于逃逸闭包,会在当前函数返回后才执行,因此会触发编译器校验错误。
修复方案
给所有需要在异步回调中执行的闭包参数标记 @escaping 注解即可,修改后的完整代码如下:
// 给function参数加@escaping,解决#3错误 func getUsernameRequest(function: @escaping () -> Void) { // 发起API请求获取用户信息 let url = "\(K.API.baseAPIEndpoint)/user" let headers: HTTPHeaders = [...] AF.request(url, headers: headers).responseDecodable(of: UserModel.self) { response in if let value = response.value { self.username = value.username // 其他逻辑处理 function() } else { offlineBanner() } } } // 两个闭包参数都加@escaping,同时function的入参闭包也要加@escaping,解决#1、#2错误 func getMessagesRequest(function: @escaping (@escaping () -> Void) -> Void, anotherFunc: @escaping () -> Void) { let postDetailUrl = "\(K.API.baseAPIEndpoint)/posts/\(postArray[indexPath.row].id)" let headers: HTTPHeaders = [...] // 发起API请求获取关联消息 AF.request(postDetailUrl, headers: headers).responseDecodable(of: PostDetailModel.self) { response in if let value = response.value { self.messages = value.messages function(anotherFunc) } else { offlineBanner() } } } func performSegueToChat() -> Void { self.performSegue(withIdentifier: K.Segue.GotoChat, sender: self) } // 调用逻辑不变 getMessagesRequest(function: getUsernameRequest, anotherFunc: performSegueToChat)
可选优化
如果两个请求没有前后依赖关系,可以用DispatchGroup实现并行请求,减少总等待时间:
func fetchAllDataAndJump() { let group = DispatchGroup() group.enter() getUsernameRequest { group.leave() } group.enter() // 单独封装无回调的getMessagesRequest,请求成功后调用group.leave() group.notify(queue: .main) { // 两个请求都完成后执行跳转 self.performSegueToChat() } }
内容的提问来源于stack exchange,提问作者user17353495
相关产品推荐
相关产品推荐

