【问题标题】:UIImageView caching data from APIUIImageView 从 API 缓存数据
【发布时间】:2020-05-16 22:59:22
【问题描述】:

当我快速滚动 UITableView 时,imageView 会显示来自 API 的错误图像。 (即英国脱欧文章中显示的三星图片等)。

这是一个允许我下载图片的扩展程序(也许我可以在这里更改一些内容):

extension UIImageView {
    func donwloadImage(from url: String) {
        let urlRequest = URLRequest(url: URL(string: url)!)
        let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in

            if error != nil {
                print(error)
                return
            }

            DispatchQueue.main.async {
                self.image = UIImage(data: data!)

            }
        }
        task.resume() 
    }

}

【问题讨论】:

  • 你为什么不为此使用 3rd 方库?如果你愿意,我可以给你几个库的链接。
  • 是的,也许我可以试一试,谢谢!
  • 应该没有必要为这样的事情使用第三方依赖项——你只是无缘无故地使你的代码库复杂化。如果没有看到 tableView 代码,我们无法确定,但这几乎可以肯定是由于图像下载是异步的并且速度不够快,无法快速滚动,因此它显示了上次使用单元格时的图像。考虑清除之前的图像或在cellForRowAt 或预缓存图像中设置默认值。

标签: ios swift uitableview caching image-caching


【解决方案1】:

【讨论】:

  • @Kwon Min-sik 对你有用吗?如果您需要任何帮助,请发表评论。
【解决方案2】:

以下是显示正确处理的示例。请试一试。


class CustomViewCell: UITableViewCell {

@IBOutlet weak var imageView: UIImageView!

private var task: URLSessionDataTask?

override func prepareForReuse() {
    super.prepareForReuse()
    task?.cancel()
    imageView.image = nil
}

func configureWith(url string: String) {
    guard let url = URL(string: string) else { return }

    task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let data = data, let image = UIImage(data: data) {
            DispatchQueue.main.async {
                self.imageView.image = image
            }
        }
    }
    task?.resume()
 }
}

【讨论】:

    【解决方案3】:

    一定要为此使用库。

    建议

    https://github.com/kean/Nuke

    nuke 非常简单。

    Nuke.loadImage(with: url, into: imageView)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2016-09-05
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      相关资源
      最近更新 更多