使用图像(url)从 JSON 下载 shopItems

问题描述 投票:0回答:1

我正在尝试从服务器下载项目作为 JSON,每个项目都有一个链接(URL)用于它的图像。

对(获取后重新加载数据)进行了编辑,但仍然没有按预期工作。

public class ShopModel: Codable {
    
    var latest: [ShopItem]
    var flashSale: [ShopItem]
}

struct ShopItem: Codable {
    let category: String
    let name: String
    let price: Double
    let image_url: URL
    
    var image: UIImage? {
        get async throws {
            let (data, _) = try await URLSession.shared.data(from: image_url)
            return UIImage(data: data)
        }
    }
}

我做了一个自定义的 NetworkHelper 来获取项目:

public class NetworkHelper {
    
    var items: [ShopItem] = []
    
    static let shared = NetworkHelper()
    
    let flashSaleURL = URL(string: "https://run.mocky.io/v3/a9ceeb6e-416d-4352-bde6-2203416576ac")
    
    
    
    func downloadLatest() async throws -> [ShopItem] {
        let latestURL = URL(string: "https://run.mocky.io/v3/cc0071a1-f06e-48fa-9e90-b1c2a61eaca7")!
        
        let (data, response) = try await URLSession.shared.data(from: latestURL)
        
        guard let httpResponse = response as? HTTPURLResponse,
              (200..<300).contains(httpResponse.statusCode) else { throw URLError(.badServerResponse) }
        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        let results = try decoder.decode(ShopModel.self, from: data)
        print("items downloaded")
        return results.latest
    }
}

但我需要在自定义 UICollectionView 中显示这些项目(图像)及其“名称”、“价格”和“类别”。

我试图在 VC 的 viewWillAppear 中检索这些项目,并将它们放在 [ShopItem] 类型的 CollectionView 属性“cells”中。 比在 collectionView 的 cellForItemAt 中检索每个单元格/项目的图像但是 我收到一条错误消息说“索引超出范围”(对于项目的名称和图像)意味着我的项目数组由于某种原因是空的。

 public override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        Task {
            do {
                self.latestCollectionView.cells = try await NetworkHelper.shared.downloadLatest()
self.latestCollectionView.reloadData()
            } catch {
                print(error)
            }
        }
    }
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cells.count
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = dequeueReusableCell(withReuseIdentifier: LatestCollectionViewCell.reuseID, for: indexPath) as! LatestCollectionViewCell
       
//        cell.nameLabel.text = cells[indexPath.row].name
        Task {
            cell.mainImageView.image = try await cells[indexPath.row].image
        }
    
        return cell
    }
}

JSON 文件中有 4 个项目,所以我硬编码了项目的数量。 我正在寻求帮助以了解为什么我的数组为空以及如何获得带有图像的预期项目。 我猜我使用 async await 是错误的

swift async-await uicollectionview
1个回答
0
投票

运行时间:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 4
}

你的收藏仍然是空的

self.latestCollectionView.cells = try await NetworkHelper.shared.downloadLatest()

还没有回来。不要在

numberOfItemsInSection
.

中硬编码值

更好:

检索集合的计数:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    self.latestCollectionView.cells.count
}

从网络中检索集合后:

Task {
    do {
        self.latestCollectionView.cells = try await NetworkHelper.shared.downloadLatest()
        //or whatever the your tableview is called
        tableview.reloadData()
    } catch {
        print(error)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.