下載後檢查單元格是否仍然可見

有時下載的時間比顯示單元格的時間長。在這種情況下,可能會發生下載的影象顯示在錯誤的單元格中。要解決此問題,我們無法使用 UIImageView 擴充套件

我們仍將使用 Alamofire 但是我們將使用完成處理程式來顯示影象。

在這種情況下,我們仍然需要一個 tableView,其中包含一個包含 imageView 的單元格。在 cellForRowAt:方法中,我們將使用以下程式碼下載影象:

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

在此示例中,我們首先將影象設定為佔位符影象。後來,我們下載的圖片用的 request 方法 Alamofire 。我們將 url 作為第一個引數傳遞,因為我們只想獲取影象,我們將使用 .get HTTP 方法。由於我們正在下載影象,我們希望響應是影象,因此我們使用 .responseImage 方法。

下載影象後,呼叫閉包,首先我們確保下載的影象確實存在。然後我們通過檢查 cellForRow(at:indexPath)不返回 nil 來確保單元格仍然可見。如果它沒有發生任何事情,如果它沒有,我們分配最近下載的影象。

如果使用者已在單元格上滾動,則 updateCell 將為 nil 並且 if 語句返回 nil,則此最後一個 if 語句確保單元格仍然可見。這有助於我們防止在單元格中顯示錯誤的影象。