gpt4 book ai didi

Swift 4程序在下载图像后显示数据但数据不相关

转载 作者:行者123 更新时间:2023-11-30 11:56:42 25 4
gpt4 key购买 nike

我正在制作一个快速应用程序,我可以从 API 下载数据。它给出了一个 JSON。然后我将图像 url 放入 imageArray 中,将 movieTiteUrl 放入 movieTitleArray 中。但是当我向 Collection View 显示它们时,它们显示数据,但该数据不相关。要下载图像,我使用 AlamofireImage 下面的代码将帮助您更好地理解我的问题。

inside ViewDidLoad

var imageUrlArray = [String]()
var imageArray = [UIImage]()
var movieTitleArray = [String]()

UICollectionViewDelegate

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "movieCell", for: indexPath) as? MovieCell else { return UICollectionViewCell() }
cell.movieName.image = imageArray[indexPath.row]
cell.movieNameLbl.text = movieTitleArray[indexPath.row]

return cell
}

An extension which download data and download images

func downloadImages(handler: @escaping (_ status: Bool)-> ()){
imageArray = []
movieTitleArray = []
for url in imageUrlArray{
Alamofire.request(url).responseImage(completionHandler: { (response) in
guard let image = response.result.value else { return }
self.imageArray.append(image)

if self.imageArray.count == self.imageUrlArray.count {
handler(true)
}

})
}
}

func retriveData(handler : @escaping (_ status: Bool) -> ()){
print(getPopularMovies(pageNumber: 1))
Alamofire.request(getPopularMovies(pageNumber: 1)).responseJSON { (response) in

guard let json = response.result.value as? Dictionary<String, AnyObject> else { return }
let dataDictArray = json["results"] as! [Dictionary<String, AnyObject>]

for data in dataDictArray {

guard let imageUrl = data["poster_path"] as? String else { return }
guard let name = data["original_title"] as? String else { return }
let updatedImageUrl = getFullImageUrl(imageUrl: imageUrl)
self.imageUrlArray.append(updatedImageUrl)
self.movieTitleArray.append(name)

}
handler(true)
}
}

func updateDataToCollectionView(){
retriveData{(finished) in
if finished{
self.downloadImages(handler: { (finishedDownloadingImage) in
if finishedDownloadingImage{
self.movieCollectionView.reloadData()
}
})
}
}
}

最佳答案

我发现了两个观察结果(问题)。

  1. 由于您使用异步请求下载图像,因此无法保证您会按照请求的顺序获得响应。例如,如果您请求 movie1Imagemovie2Image...,则不能保证您首先会收到 movie1Imagemovie2Image 以相同的顺序。所以肯定是不靠谱的。 使用字典来解决这个问题。 [String:Data] string -> ImageUrl, Data -> ImageData

  2. 为什么要等到所有图像下载完毕?任何特定场景或任何业务需求。理想情况下,为了获得更好的用户体验和交互,不建议等到所有图像下载完成。

关于Swift 4程序在下载图像后显示数据但数据不相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47730531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com