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
相关产品推荐
相关产品推荐

