iOS
Carica immagini asincrone
Ricerca…
Modo più semplice
Il modo più semplice per crearlo è usare Alamofire e la sua UIImageViewExtension . Quello di cui abbiamo bisogno è una vista tabella con una cella che abbia un imageView al suo interno e che la chiami imageView
.
Nella cellaForRowAt: funzione di tableView dovremmo scaricare l'immagine e impostarla nel seguente modo:
let url = URL(string: "https://httpbin.org/image/png")!
let placeholderImage = UIImage(named: "placeholder")!
imageView.af_setImage(withURL: url, placeholderImage: placeholderImage)
L'url dovrebbe puntare all'immagine che vuoi scaricare e l'immagine placeHolder dovrebbe essere un'immagine memorizzata. Chiamiamo quindi il metodo af_setImage
su imageView
che scarica l'immagine imageView
specificato e durante il download verrà mostrata l'immagine del segnaposto. Non appena viene scaricata l'immagine, viene visualizzata l'immagine richiesta
Verifica che la cella sia ancora visibile dopo il download
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.