iOS开发:点击CollectionView项仅加载对应RapidAPI数据的问题
解决方案:仅加载点击项对应ID的数据
核心修改思路
- 移除DetailViewController中循环遍历所有ID的逻辑,改为只请求用户点击的ID对应的数据
- 在CollectionView点击事件中,将选中项的ID传递给详情页
- 详情页根据传入的ID发起单次API请求,更新UI
1. 修改CollectionView点击事件代码
在didSelectItemAt方法中,把选中食物的ID传递给DetailViewController(假设WelcomeElement包含id字段,根据实际模型调整字段名):
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let navStoryboard = UIStoryboard(name: "Main", bundle: nil) let foodDetailViewController = navStoryboard.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController if let currentFood = self.foods?[indexPath.row] { foodDetailViewController.foodResultData = currentFood // 传递选中项的ID foodDetailViewController.targetFoodID = currentFood.id // 替换为你的模型实际ID字段名 } self.navigationController?.pushViewController(foodDetailViewController, animated: true) }
2. 修改DetailViewController代码
移除循环相关变量,添加接收ID的属性,调整请求逻辑为单次请求:
import UIKit import Alamofire class DetailViewController: UIViewController { @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var portionLabel: UILabel! var foodResultData : WelcomeElement? let urlData = "https://the-vegan-recipes-db.p.rapidapi.com/" var detailedFoods : Welcome? // 新增:接收从列表页传递的目标ID var targetFoodID: String? override func viewDidLoad() { super.viewDidLoad() // 仅在有目标ID时发起请求 guard let foodID = targetFoodID else { print("未获取到目标食物ID") return } fetchData(with: foodID) } // 修改:接收指定ID,发起单次请求 func fetchData(with foodID: String) { let apiKey = "" // 填入你的API Key let url = "\(urlData)\(foodID)" AF.request(url, method: .get, headers: ["x-rapidapi-key": apiKey] ).responseData { (response) in switch response.result { case .success(let value): debugPrint(value) if let data = response.data { print(response) do { let decoder = JSONDecoder() let foodInfo = try decoder.decode(Welcome.self, from: data) self.detailedFoods = foodInfo DispatchQueue.main.async { self.timeLabel.text = foodInfo.time self.portionLabel.text = foodInfo.portion } print(foodInfo) } catch { print("JSON解析错误: \(error)") } } case .failure(let error): debugPrint("请求错误:\(error.localizedDescription)") } } } }
关键说明
- 移除了原代码中
idsToFetch、currentIDIndex以及递归调用fetchData()的循环逻辑,避免不必要的批量请求 - 通过
targetFoodID属性实现列表页到详情页的ID传递,确保只请求用户选中的数据 - 在
viewDidLoad中先校验ID是否存在,再发起请求,避免无效调用
内容的提问来源于stack exchange,提问作者Dilan
相关产品推荐
相关产品推荐

