2016-12-04 2 views
0

Voici le code. C'est dans ma classe UICollectionViewDataSource.collectionview ne télécharge qu'une image dans cellForItemAtIndexPath

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let identifier = "UICollectionViewCell" 
    let photo = photos[indexPath.row] 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! PhotoCollectionViewCell 
    let url = ImageUploaderAPI.urlForPhotoPath(photoTitle: photo.remoteURL) 

    if (photo.image == nil) { 
     Alamofire.download(url).downloadProgress { progress in 
       print("Download Progress: \(progress.fractionCompleted)") 
      } 
      .responseData { response in 
      if let data = response.result.value { 
       let image = UIImage(data: data) 
       photo.image = image! 
       cell.updateWithImage(image: image) 
       print("Downloaded: " + url.absoluteString) 
       collectionView.reloadData() 
      } 
     } 
    } else { 
     cell.updateWithImage(image: photo.image) 
    } 
    return cell 
} 

Le progress.fractionCompleted montre que les images sont en cours de téléchargement, mais je ne sais pas pourquoi aucune des images sont mises à jour. Est-ce à cause de comment Alamofire fonctionne de manière asynchrone? Tout avis sera le bienvenu.

Répondre

0

J'ai fini par faire ceci:

cell.activityIndicator.startAnimating() 
    if (photo.image == nil) { 
     let dataTask = URLSession.shared.dataTask(with: url) { 
      data, response, error in 
       if error == nil { 
        if let data = data { 
         let image = UIImage(data: data) 

         print("Downloaded: " + url.absoluteString) 

         DispatchQueue.main.async { 
          photo.image = image! 
          collectionView.reloadItems(at: [indexPath]) 

         } 
        } 
       } else { 
        print(error) 
       } 
     } 
     dataTask.resume() 
    } else { 
     cell.updateWithImage(image: photo.image) 
    } 
    cell.activityIndicator.stopAnimating() 
    cell.activityIndicator.isHidden = true 

    return cell 
1

Voici 3 solutions possibles. Le premier est en raison de problèmes de thread de fond. Au lieu de simplement collectionView.reloadData, essayez d'utiliser:

DispatchQueue.main.async { 
collectionView.reloadData 
} 

Une autre solution possible est un problème .resume? Vous voudrez peut-être essayer d'ajouter .resume comme mon exemple ci-dessous:

if (photo.image == nil) { 
     Alamofire.download(url).downloadProgress { progress in 
       print("Download Progress: \(progress.fractionCompleted)") 
      } 
      .responseData { response in 
      if let data = response.result.value { 
       let image = UIImage(data: data) 
       photo.image = image! 
       cell.updateWithImage(image: image) 
       print("Downloaded: " + url.absoluteString) 
       collectionView.reloadData() 
      } 
     }.resume 
    } else { 
     cell.updateWithImage(image: photo.image) 
    } 
    return cell 
} 

Ma 3ème et solution finale est simple, se débarrasser de la if (photo.image == nil) {

Hope this helps

+0

Hey, merci pour la réponse complète. Je me rends compte maintenant qu'une seule image est en train d'être téléchargée, alors que le reste semble juste être téléchargé mais le callback 'responseData' n'est jamais appelé. Des idées? –