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

Swift网络请求中如何将用户数据存入数组并展示?

解决方法:将请求的用户数据存入数组并展示

核心调整方向

你需要把存储用户数据的变量改成可被UI监听的数组,并在获取单个用户数据时将其追加到数组中,而非覆盖单个变量。


1. 修改NetworkModel的属性定义

把原有的单个userData变量替换为@Published修饰的数组,确保UI能感知数组变化:

import Foundation

@MainActor
class NetworkModel: ObservableObject {
    
    @Published var listId: [String] = []
    var statusList = ""
    var statusUser = ""
    var temp = ""
    @Published var users: [UserData] = []  // 改成@Published数组,用于UI展示
    // 单个userData变量若无需保留可删除,如需临时查看单条数据可保留
}

2. 修改getUser函数,将数据追加到数组

原函数每次会覆盖单个用户数据,现在调整为将解码后的UserData添加到数组:

func getUser(url: String) {
    guard let url = URL(string: "https://opn-interview-service.nn.r.appspot.com/get/\(url)") else { fatalError("Missing URL") }
    var request = URLRequest(url: url)
    request.addValue("bearer \(token)", forHTTPHeaderField: "Authorization")
    let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if let error = error {
            print("Request error", error)
            return
        }
        guard let response = response as? HTTPURLResponse else { return }
        if response.statusCode == 200 {
            guard let data = data else { return }
            DispatchQueue.main.async { [self] in
                do {
                    let decoded = try JSONDecoder().decode(UserRespons.self, from: data)
                    self.statusUser = decoded.status
                    // 将解码后的用户数据追加到数组
                    self.users.append(decoded.data)
                    print("UserData added: name = \(decoded.data.firstName) Lastname = \(decoded.data.lastName) gender = \(decoded.data.gender)")
                } catch let error{
                    print("Error decode", error)
                }
            }
        }
    }
    dataTask.resume()
}

3. 优化getList函数(可选)

为避免重复加载导致数组堆积数据,可在请求列表前清空数组:

func getList() {
    guard let url = URL(string: "https://opn-interview-service.nn.r.appspot.com/list") else { fatalError("Missing URL") }
    var request = URLRequest(url: url)
    request.addValue("bearer \(token)", forHTTPHeaderField: "Authorization")
    let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if let error = error {
            print("Request error", error)
            return
        }
        guard let response = response as? HTTPURLResponse else { return }
        if response.statusCode == 200 {
            guard let data = data else { return }
            DispatchQueue.main.async { [self] in
                do {
                    let decoded = try JSONDecoder().decode(DataRespons.self, from: data)
                    self.listId = decoded.data
                    self.statusList = decoded.status
                    
                    // 清空数组,避免重复数据
                    self.users.removeAll()
                    
                    for userId in self.listId {
                        print("This is id = \(userId)")
                        getUser(url: userId)
                    }
                } catch let error{
                    print("Error decode", error)
                }
            }
        }
    }
    dataTask.resume()
}

4. 在SwiftUI视图中展示数组数据

利用@StateObject绑定模型,通过List遍历数组展示内容:

struct UserListView: View {
    @StateObject var networkModel = NetworkModel()
    
    var body: some View {
        List(networkModel.users) { user in
            VStack(alignment: .leading) {
                Text("\(user.firstName) \(user.lastName)")
                    .font(.headline)
                Text("Age: \(user.age) | Country: \(user.country)")
                    .font(.subheadline)
                    .foregroundColor(.secondary)
            }
        }
        .onAppear {
            networkModel.getList()
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:25:25