如何通过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
相关产品推荐
相关产品推荐

