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,强制解包会直接触发崩溃,导致渲染逻辑失效。
修复方案
- 删掉
MoneyViewinit方法里强制解包currency的打印代码,避免初始化阶段就触发崩溃。 - 视图层对可选值做安全处理,不要使用强制解包,请求完成前可展示加载状态,修改后参考代码:
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") } }
- 额外注意:你使用的是HTTP协议接口,需要在项目Info.plist中配置ATS权限,添加
NSAppTransportSecurity节点下的NSAllowsArbitraryLoads为YES,否则iOS默认会拦截HTTP请求。
内容的提问来源于stack exchange,提问作者Farhandika
相关产品推荐
相关产品推荐

