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

SwiftUI API请求成功有返回值却无法在视图展示且init打印为nil排查

问题原因及修复方案

1. 日志警告说明

控制台打印的nw_protocol_get_quic_image_block_invoke dlopen libquic failed属于系统级警告,是iOS底层尝试加载QUIC协议库失败触发的,和业务逻辑完全无关,不影响正常HTTP请求执行,可直接忽略。

2. 初始化时currency为nil的原因

URLSession.dataTask是异步后台执行的逻辑:MoneyView初始化调用fetchData()后,请求会放到后台线程执行,不会等待接口返回就会继续执行init里后续的打印代码,此时接口还没返回结果、currency还没有被赋值,自然为nil。只有当请求成功回到回调的DispatchQueue.main.async块时,才会给currency赋值,所以回调内部的打印可以拿到有效值。

3. 视图展示失效的原因

你在NewDisplay中直接对currency做强制解包self.fetch.currency!.CAD,页面初始渲染时请求还没完成,currency为nil,强制解包会直接触发崩溃,导致渲染逻辑失效。


修复方案

  1. 删掉MoneyView init方法里强制解包currency的打印代码,避免初始化阶段就触发崩溃。
  2. 视图层对可选值做安全处理,不要使用强制解包,请求完成前可展示加载状态,修改后参考代码:
struct NewDisplay: View {
    // 若项目支持iOS14及以上,建议把@ObservedObject替换为@StateObject,避免视图刷新时重复初始化MoneyView
    @ObservedObject var fetch = MoneyView()
    var body: some View {
        if let currency = fetch.currency {
            Text(String(currency.CAD))
        } else {
            Text("汇率加载中...")
        }
        Text("Makan bang")
    }
}
  1. 额外注意:你使用的是HTTP协议接口,需要在项目Info.plist中配置ATS权限,添加NSAppTransportSecurity节点下的NSAllowsArbitraryLoads为YES,否则iOS默认会拦截HTTP请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 07:45:03