iOS Verifica che la cella sia ancora visibile dopo il download


Esempio

A volte il download richiede più tempo rispetto a quando la cella viene visualizzata. In questo caso può succedere che l'immagine scaricata sia mostrata nella cella sbagliata. Per risolvere questo problema non possiamo usare l' estensione UIImageView .

Useremo comunque Alamofire, tuttavia useremo il gestore di completamento per visualizzare l'immagine.

In questo scenario abbiamo ancora bisogno di una tabellaView con una cella che ha un imageView in esso. Nel cellForRowAt: metodo dovremmo scaricare l'immagine con il seguente codice:

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
    }
}

In questo esempio, per prima cosa impostiamo l'immagine sull'immagine segnaposto. Successivamente scarichiamo l'immagine con il metodo di request di Alamofire . Passiamo l'url come primo argomento e dal momento che vogliamo solo ottenere l'immagine useremo il metodo HTTP .get . Dal momento che stiamo scaricando un'immagine vogliamo che la risposta sia un'immagine, quindi usiamo il metodo .responseImage .

Dopo che l'immagine è stata scaricata, la chiusura viene chiamata e prima di tutto ci assicuriamo che l'immagine scaricata esista effettivamente. Quindi ci assicuriamo che la cella sia ancora visibile controllando che cellForRow (a: indexPath) non restituisca nulla. Se non succede nulla, se non lo facciamo assegniamo l'immagine scaricata di recente.

Quest'ultima istruzione if garantisce che la cella sia ancora visibile se l'utente ha già fatto scorrere la cella, l'updateCell sarà nullo e l'istruzione if restituirà zero. Questo ci aiuta a prevenire la visualizzazione dell'immagine sbagliata in una cella.