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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:15:44