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

双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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:36:04