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

Swift 5 API调用中如何设置completion handlers及@escaping回调

实现带回调的登录接口方案

网络请求属于异步操作,login函数发起请求后会立刻返回,请求结果要等网络响应回来后才会触发,因此需要用@escaping标记回调闭包,允许闭包在函数执行结束后再调用。

第一步:修改login函数,添加逃逸回调参数

可以先定义回调类型方便复用:

// 回调参数用Result类型,成功携带User对象,失败携带错误信息
typealias LoginCompletion = (Result<User, Error>) -> Void

修改后的login函数代码:

func login(with credentials: LoginCredentials, completion: @escaping LoginCompletion) {
    let params = credentials
    AF.request(Service.baseURL.appending("/user/login"), method: .post, parameters: params, encoder: JSONParameterEncoder.default).responseJSON { response in
        switch response.result {
        case .success:
            // 替换为你已有的将响应数据转为User对象的逻辑即可
            if let user = try? JSONDecoder().decode(User.self, from: response.data ?? Data()) {
                completion(.success(user))
            } else {
                let parseError = NSError(domain: "LoginService", code: -1, userInfo: [NSLocalizedDescriptionKey: "用户数据解析失败"])
                completion(.failure(parseError))
            }
        case .failure(let error):
            completion(.failure(error))
        }
    }
}

第二步:调用login函数并处理回调结果

传入闭包即可处理请求成功/失败的对应逻辑,示例代码:

let loginParams = LoginCredentials(account: "你的账号", password: "你的密码")
login(with: loginParams) { [weak self] result in
    guard let self = self else { return }
    switch result {
    case .success(let user):
        // 登录成功处理逻辑:比如保存用户信息、跳转主页
        self.handleLoginSuccess(user: user)
    case .failure(let error):
        // 登录失败处理逻辑:比如弹出错误提示、重置输入框
        self.handleLoginFailure(error: error)
    }
}

注意事项

  • 回调闭包内如果需要引用self,一定要加[weak self]避免循环引用导致内存泄漏
  • 也可以根据业务需求调整回调参数格式,比如用两个可选值(User?, Error?)作为回调入参,和Result类型的使用效果一致

内容的提问来源于stack exchange,提问作者qrolotrolpolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:24:05