SwiftUI登录功能异常:API返回正常但CompletionHandler回调未执行
登录API回调不执行的排查方案
排查网络请求的线程切换
网络请求的回调通常在后台线程执行,如果直接在后台线程调用CompletionHandler,可能导致后续逻辑(比如修改UserDefaults、UI更新)无法正常触发。务必在调用回调前切回主线程:DispatchQueue.main.async { completion(.success(yourResponseData)) }确保所有分支都调用了CompletionHandler
检查登录请求的代码逻辑:API成功返回、网络错误、数据解析失败、超时等所有场景,是否都调用了completion?比如只在成功分支调用,错误分支完全没处理,就会导致回调永远不执行。检查循环引用问题
如果在网络请求的闭包里捕获了self(比如ViewModel实例),却没使用weak或unowned,会形成循环引用,导致ViewModel无法释放,回调也无法触发。修改捕获列表:URLSession.shared.dataTask(with: request) { [weak self] data, response, error in // 处理请求结果 self?.handleResponse(data, response, error, completion: completion) }.resume()验证回调参数的传递匹配性
确认LoginViewModel的login方法中,CompletionHandler的参数类型和视图层传入的闭包类型完全一致。比如方法定义是@escaping (Result<LoginResult, Error>) -> Void,视图层传入的闭包就不能是其他类型,类型不匹配会导致回调静默失效。检查数据解析的异常捕获
虽然控制台能打印API返回数据,但如果解析过程中抛出未捕获的异常,代码会卡在解析步骤,无法走到调用回调的环节。给解析逻辑加上do-catch块,确保异常被处理并触发failure回调:do { let loginResult = try JSONDecoder().decode(LoginResult.self, from: data!) completion(.success(loginResult)) } catch { print("解析错误:\(error)") completion(.failure(error)) }
内容的提问来源于stack exchange,提问作者bushra
相关产品推荐
相关产品推荐

