如果我快速滚动tableView

时间:2017-07-10 14:13:59

标签: ios swift uitableview asynchronous cell

尝试在(Xcode 9和Swift 4)中异步加载tableView中的图像,似乎我的方法正确,但如果我快速滚动tableView,我的代码就会停止工作。所以基本上我有发现无错误 这是我的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell


    let feed = feeds[indexPath.row]

    cell.titleLabel.text = feed.title
    cell.pubDateLabel.text = feed.date
    cell.thumbnailImageView.image = nil

    if let image = cache.object(forKey: indexPath.row as AnyObject) as? UIImage {
        cell.thumbnailImageView?.image = image
    } else {

        let imageStringURL = feed.imageUrl

        guard let url = URL(string: imageStringURL) else { fatalError("there is no correct url") }

        URLSession.shared.downloadTask(with: url, completionHandler: { (url, response, error) in

            if let data = try? Data(contentsOf: url!) {
                DispatchQueue.main.async(execute: {
                    guard let image = UIImage(data: data) else { fatalError("can't create image") }

                    let updateCell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell // fast scroll issue line

                    updateCell.thumbnailImageView.image = image
                    self.cache.setObject(image, forKey: indexPath.row as AnyObject)
                })
            }
        }).resume()
    }

    return cell
}

我有问题:

let updateCell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell

如果我慢慢向下滚动,一切正常,不会出现错误。

有谁知道我犯了哪个错误?

2 个答案:

答案 0 :(得分:3)

如果您尝试使用tableView.cellForRow(at:)的单元格当前不可见,则可能会发生这种情况 为避免崩溃,您可以使用选项:

let updateCell = tableView.cellForRow(at: indexPath) as? CustomTableViewCell // fast scroll issue line
updateCell?.thumbnailImageView.image = image

保持一切正常,我希望它应该没有任何错误。

答案 1 :(得分:0)

您可以考虑一个流行的UIImage扩展库,就像我在评论中所说的那样AlamofireImage并使用占位符设置缩略图,一旦图像准备就绪,它将自动替换。

我改变的另一件事是没有必要让我删除它。

请添加占位符图片并测试它是否有效,抱歉我没有完全检查语法。

BackgroundNode

}