Swift:如何从Data.swift在ProductList视图中展示API返回数据?
在ProductList.swift中展示数据的步骤
1. 创建数据管理类(可放在data.swift或单独文件)
先写一个遵循ObservableObject的类来处理数据获取与状态管理,让视图能自动响应数据变化:
import Foundation import Combine class ProductDataManager: ObservableObject { @Published var products: [Search] = [] // 替换为你的产品模型数组类型 @Published var isLoading = false @Published var error: Error? = nil func fetchProducts() { isLoading = true error = nil guard let url = URL(string: "你的Rapid-Api请求URL") else { error = NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "无效URL"]) isLoading = false return } var request = URLRequest(url: url) request.addValue("你的Rapid-Api Key", forHTTPHeaderField: "X-RapidAPI-Key") request.addValue("你的Rapid-Api Host", forHTTPHeaderField: "X-RapidAPI-Host") // 根据API要求添加其他请求头或参数 URLSession.shared.dataTask(with: request) { [weak self] data, response, error in DispatchQueue.main.async { self?.isLoading = false if let error = error { self?.error = error return } guard let data = data else { self?.error = NSError(domain: "", code: -2, userInfo: [NSLocalizedDescriptionKey: "无返回数据"]) return } do { let decodedResponse = try JSONDecoder().decode(Response.self, from: data) // 根据你的结构体层级调整取值路径,比如decodedResponse.data.search self?.products = decodedResponse.data.search } catch let decodingError { self?.error = decodingError print("解析失败:\(decodingError)") } } }.resume() } }
2. 在ProductList视图中使用数据管理器
在视图里初始化数据管理器,监听数据状态并展示对应UI:
import SwiftUI struct ProductList: View { @StateObject private var dataManager = ProductDataManager() // Xcode12.4支持iOS14+,用@StateObject var body: some View { NavigationView { Group { if dataManager.isLoading { ProgressView("加载中...") } else if let error = dataManager.error { Text("加载失败:\(error.localizedDescription)") .foregroundColor(.red) } else if dataManager.products.isEmpty { Text("暂无产品数据") } else { List(dataManager.products) { product in // 根据你的Search结构体属性自定义展示内容 VStack(alignment: .leading) { Text(product.name) .font(.headline) Text("价格:\(product.price)") .font(.subheadline) .foregroundColor(.gray) // 添加其他需要展示的字段 } } } } .navigationTitle("产品列表") .onAppear { dataManager.fetchProducts() // 视图出现时触发数据请求 } } } } // 注意:你的Search结构体需要遵循Identifiable协议,否则List无法直接遍历 // 示例修改data.swift中的Search结构体: // struct Search: Decodable, Identifiable { // let id: String // 替换为你模型中的唯一标识字段,比如productId // // 其他属性... // } // 若没有现成唯一标识,可在List中手动指定id:List(dataManager.products, id: \.self) { ... }(需Search遵循Equatable)
3. 关键注意事项
- 确保
Search结构体遵循Identifiable协议,或在List中手动指定唯一标识,否则无法正常遍历展示。 - 数据解析时要严格匹配
Response、Data、Search的结构体层级,避免因路径错误导致无法获取产品数据。 - 网络请求必须携带Rapid-Api要求的
X-RapidAPI-Key和X-RapidAPI-Host请求头,否则会返回权限错误。 - 异步请求完成后,必须在主线程更新UI状态,代码中已通过
DispatchQueue.main.async处理,避免UI异常。
内容的提问来源于stack exchange,提问作者anon867
相关产品推荐
相关产品推荐

