SwiftUI使用URLSession+JSONDecoder解析数据后List不显示如何解决
你的代码存在以下几处问题,修复后即可正常在List中展示数据:
- 模型字段类型与接口返回不匹配:目标接口返回的
userId和id均为整数类型,你当前定义为String会直接触发JSON解析错误 - 解析目标类型错误:接口返回的是由多条帖子组成的数组,你当前解析的是单个
ResponseData对象,类型不匹配会导致解析失败 - 解析结果未绑定状态变量:你解析得到的结果没有赋值给
@State修饰的responseData,视图无法收到数据变更的通知 - 异步逻辑适配问题:你在
async标记的函数中使用了基于闭包回调的dataTask方法,且闭包默认在后台线程执行,直接修改UI状态会存在异常,建议直接使用URLSession原生的async/await接口适配当前异步上下文
修复后的完整代码
模型代码
struct ResponseData: Codable, Identifiable { var userId: Int var id: Int var title: String var body: String }
新增Identifiable协议适配后,List可以自动识别id字段,无需手动指定。
ContentView代码
import SwiftUI struct ContentView: View { @State private var responseData = [ResponseData]() var body: some View { List(responseData) { item in VStack(alignment: .leading, spacing: 4) { Text(item.title) .font(.headline) Text(item.body) .font(.body) .foregroundColor(.secondary) } .padding(.vertical, 4) } .task { await loadData() } } func loadData() async { let urlString = "https://jsonplaceholder.typicode.com/posts" guard let url = URL(string: urlString) else { return } do { let (data, _) = try await URLSession.shared.data(from: url) responseData = try JSONDecoder().decode([ResponseData].self, from: data) } catch { print("加载失败:\(error.localizedDescription)") } } }
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

