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

如何通过URLSession接口调用返回的数据更新SwiftUI的View视图

实现方案

你需要在HomeTab视图中声明响应式状态属性存储接口返回的待展示内容,SwiftUI会在状态属性变更时自动刷新关联的视图,具体修改如下:

1. 完整修改后的HomeTab代码

struct HomeTab: View {
    // 声明状态属性,存储要展示的文本,初始值设为加载占位
    @State private var displayName: String = "加载中..."

    var body: some View {
        VStack(spacing: 1) {
            // 直接绑定状态属性到Text
            Text(displayName)
            Spacer()
        }
        .padding()
        .onAppear {
            callDevices().getDevices { response in
                // 安全取值,避免数组为空导致崩溃
                if let firstDevice = response.devices.first,
                   let firstRelation = firstDevice.parentRelations.first {
                    // 状态属性赋值会自动触发视图刷新
                    self.displayName = firstRelation.displayName
                } else {
                    self.displayName = "暂无数据"
                }
            }
        }
    }
}

2. 实现说明

  • 用@State包装的属性属于SwiftUI的响应式状态,只要属性值发生变化,绑定该属性的视图就会自动刷新
  • 你封装的getDevices方法已经把回调派发到了主队列,所以在回调里直接给状态属性赋值即可,不需要额外处理线程
  • 每次onAppear触发时都会重新发起请求,新的返回值会覆盖状态属性的旧值,实现每次页面出现都更新数据的需求

3. 可选优化建议

你当前的请求代码里用了try!强制解码,一旦接口返回数据格式不符合预期会直接崩溃,建议替换为安全的do-catch处理:

// 把原来的let theData = try! ... 替换为以下代码
do {
    let theData = try JSONDecoder().decode(Welcome.self, from: data)
    DispatchQueue.main.async {
        completion(theData)
    }
} catch {
    print("解码失败: \(error.localizedDescription)")
    // 可选:新增失败回调通知页面请求失败
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:57:04