从我的 S3 存储桶加载图像和滚动 tableview 时冻结

Freezing while loading image from my S3 bucket and while scrolling tableview

我一直在开发一个加载大量图像的应用程序。我有一个 table 视图单元格,每个视图单元格都有一个图像。
图像存储在 S3 存储桶中。 每张图片都很大,大约 720 KB,每次我滚动屏幕时都会冻结一点以获取整张图片。

这是我获取图像的代码

let url: String = "\(K.baseURLForImage)\(cellImageURL)"
let validURL = URL(string: url)
if let imageData = try? Data(contentsOf: validURL!) {
    let image = UIImage(data: imageData)
    cell.cellImage.image = image
}

当然不是很好,那么我有什么办法可以解决这个问题吗?
听说不用dequeueReusableCell不好

提前致谢。

编辑
我添加了这些行

    if let validURL = URL(string: url) {
        task = URLSession.shared.dataTaskPublisher(for: validURL)
            .sink(receiveCompletion: { completion in
                // error handling
                print("failed URL: '\(url)'")
            }, receiveValue: { (data, response) in
                image = UIImage(data: data)
            })
        return image
    } else {
        return nil
    }

但是我每次调用这个函数都会得到nil
我检查了图像的 URL 是否有效。

如上所述,Data(contentsOf:) 是一个阻塞调用,调用它的线程上的任何 activity 都将停止,包括从主线程调用的情况。

切换到使用 URLSession 函数之一。

一个可能的例子:

import Combine

let url = "https://via.placeholder.com/150"
var task: AnyCancellable? // Do not let this go out of scope until data is loaded

if let validURL = URL(string: url) {
    task = URLSession.shared.dataTaskPublisher(for: validURL)
        .sink(receiveCompletion: { completion in
            // error handling
        }, receiveValue: { (data, response) in
            let image = UIImage(data: data)
            cell.cellImage.image = image
        })
}

我用 Kingfisher 解决了我的问题!

这是我的代码

import Kingfisher

let url: String = "some url"
let validURL = URL(string: url)
KF.url(validURL!)
    .set(to: cell.cellImage)

return cell