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

时间:2017-12-09 16:16:22

标签: swift uicollectionview alamofire

我正在制作一个快速的应用程序,我从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()
                }
            })
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

  1. 当您使用异步请求下载图片时,无法保证您将按要求的顺序获得响应。例如,如果您请求 movie1Image movie2Image ....首先您将收到 movie1Image movie2Image,这不是保证以相同的顺序。所以绝对不可靠。 使用Dictionary来解决这个问题。 [String:Data] string - &gt; ImageUrl,Data - &gt;的ImageData

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