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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:01:35