使用Kingfisher将UIImage直接设置为UIImageView

6

我希望能够直接使用UIImage设置图像,而不是从任何来源或资源中获取。我已经有了我的图像,并希望将其缓存到我的imageView中。

let myImage = UIImage

kingfisherView.kf.setImage(with: myImage)

我希望您能够像设置UIImageView一样完成此操作。
UIImageView.image = myImage

有了缓存

我不是从源头下载图像,而是通过自己生成它们(使用Latex),并使用缓存。

let cache = ImageCache.default

cache.store(renderedLaTeX ?? UIImage(), forKey: "image\(indexPath.row)")

我只是想将缓存图像设置为我的imageView。

UIImage.image = cachedImage

无法工作,并且在我在CollectionViewCell中向上和向下滚动时一遍又一遍地加载图像。

还有其他方法可以做到这一点,以便我不必一遍又一遍地加载imageView与图片。 我的ImageViewUICollectionViewCell中。


我认为、希望和相信,KingFisher 使用缓存,因此如果已经下载了图像,则不会再次下载,而是使用缓存版本。可能有一个设置可以使用。 - Larme
@Larme 是的,图像已存储在缓存中,但我面临的问题是,在 kingfisher 中没有选项(或者我没有找到)可以直接将从缓存检索到的图像分配给带有 kingfisher 的 UIImageView。 - Deepak Verma
1个回答

5

您可以通过以下方式在Kingfisher缓存中存储已有的图像:

let image: UIImage = //...
ImageCache.default.store(image, forKey: cacheKey)

默认情况下,Kingfisher使用url.absoluteString作为cacheKey

因此,如果您已经从其他地方下载了图像并仍然拥有此URL,则可以自己将它们存储在缓存中,下一次Kingfisher将不会下载图像,而是使用缓存的图像。

如果您只想进行缓存而不下载,则可以通过以下方式检索图像:

cache.retrieveImage(forKey: "cacheKey") { result in
    switch result {
    case .success(let value):
        print(value.cacheType)

        // If the `cacheType is `.none`, `image` will be `nil`.
        print(value.image)

    case .failure(let error):
        print(error)
    }
}

但由于您将其用在集合视图中,请确保在重用collectionViewCell时停止加载

单元格示例:
我们在单元格中存储imageKey,当缓存返回图像给我们时,我们确保单元格尚未被重用,仍需要此图像。如果单元格被重用,则在prepareToReuse()中删除存储的imageKey

class LatexCell: UICollectionViewCell {
    @IBOutlet var formulaImageView: UIImageView!
    private var imageKey: String?

    func setup(with imageKey: String) {
        self.imageKey = imageKey
        ImageCache.default.retrieveImage(forKey: imageKey) { [weak self] result in
            guard self?.imageKey == imageKey else { return } // cell have been reused
            switch result {
            case .success(let value):
                self?.formulaImageView.image = value.image

            case .failure(let error):
                break /// no image stored, you should create new one
            }
        }
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        imageKey = nil
        formulaImageView.image = nil // Probably want here placeholder image
    }
}   

我并不是从源头下载图像,而是通过自己生成(Latex)来缓存它们,使用self.cache.store(renderedLaTeX ?? UIImage(), forKey: "image\(indexPath.row)")。我只想将缓存的图像设置到我的imageView上。UIImage.image = cachedImage无法正常工作,并且在我向上或向下滚动时一遍又一遍地加载图像,出现在CollectionViewCell中。 - Deepak Verma
@DeepakVerma,请查看更新的答案。希望能对您有所帮助 :) - ManWithBear
是的,我正在完全按照这样做。我只想在我的UIImageView中显示这个value.image。我尝试通过UIImageView.image = value.image来实现这一点,但由于可重用单元格而始终重新加载。而且,由于我显示了大量图像(约25张),第一张图像出现在第四张的位置。这是我面临的主要问题。希望我能够解释清楚真正的问题,因为我很不擅长解释:p - Deepak Verma
@DeepakVerma 我添加了处理单元格重用的示例。您需要确保加载的图像仍然是单元格需要显示的图像。 - ManWithBear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接