iOS Vérifiez que la cellule est toujours visible après le téléchargement


Exemple

Parfois, le téléchargement prend plus de temps que l'affichage de la cellule. Dans ce cas, il peut arriver que l'image téléchargée soit affichée dans la mauvaise cellule. Pour résoudre ce problème, nous ne pouvons pas utiliser l' extension UIImageView .

Nous utiliserons toujours Alamofire, mais nous utiliserons le gestionnaire d'achèvement pour afficher l'image.

Dans ce scénario, nous avons toujours besoin d'une tableView avec une cellule contenant une imageView. Dans la méthode cellForRowAt: nous téléchargerions l'image avec le code suivant:

let placeholderImage = UIImage(named: "placeholder")!
imageView.image = placeholderImage

let url = URL(string: "https://httpbin.org/image/png")!

Alamofire.request(url!, method: .get).responseImage { response in
    guard let image = response.result.value else { return }

    if let updateCell = tableView.cellForRow(at: indexPath) {
        updateCell.imageView.image = image
    }
}

Dans cet exemple, nous définissons d'abord l'image sur l'image de l'espace réservé. Ensuite, nous téléchargeons l'image avec la méthode de request d' Alamofire . Nous passons l'URL comme premier argument et comme nous voulons juste obtenir l'image, nous utiliserons la méthode HTTP .get . Comme nous téléchargeons une image, nous voulons que la réponse soit une image. Nous utilisons donc la méthode .responseImage .

Une fois l'image téléchargée, la fermeture est appelée et tout d'abord, nous nous assurons que l'image téléchargée existe réellement. Ensuite, nous nous assurons que la cellule est toujours visible en vérifiant que le cellForRow (at: indexPath) ne retourne pas nil. Si cela ne se produit rien, si ce n'est pas le cas, nous attribuons l'image récemment téléchargée.

Cette dernière instruction if garantit que la cellule est toujours visible si l'utilisateur a déjà fait défiler la cellule pour que updateCell soit nulle et que l'instruction if renvoie nil. Cela nous aide à éviter d'afficher la mauvaise image dans une cellule.