我正在制作一个快速的应用程序,我从API下载数据。这给了一个JSON.And从那里我把图像url放在movieArray和movieTitleArray中的movieTiteUrl。但当我向集合视图显示它们时,它们显示数据,但数据不相关。要下载图像,我正在使用AlamofireImage下面的代码将帮助您更好地理解我的问题。
在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
}
下载数据和下载图像的扩展程序
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()
}
})
}
}
}
答案 0 :(得分:0)
我发现了两个观察(问题)。
当您使用异步请求下载图片时,无法保证您将按要求的顺序获得响应。例如,如果您请求 movie1Image , movie2Image ....首先您将收到 movie1Image 和 movie2Image,这不是保证以相同的顺序。所以绝对不可靠。 使用Dictionary来解决这个问题。 [String:Data] string - &gt; ImageUrl,Data - &gt;的ImageData
为什么要等到所有图片都下载完毕?任何特定场景或任何业务需求。理想情况下,为了获得更好的用户体验和互动,建议不要等到所有图片都下载完毕。