直接用kingfisher将UIImage设置为UIImageView

Dee*_*pak 6 uiimageview ios nscache swift kingfisher

我想直接使用 UIImage 设置图像,而不是从任何源、资源。我已经有了我的图像,并且想将其设置为缓存到我的 imageView 中。

let myImage = UIImage

kingfisherView.kf.setImage(with: myImage)
Run Code Online (Sandbox Code Playgroud)

我希望像将图像设置为 UIImageView 那样完成此操作

UIImageView.image = myImage
Run Code Online (Sandbox Code Playgroud)

但是有了缓存

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

let cache = ImageCache.default

cache.store(renderedLaTeX ?? UIImage(), forKey: "image\(indexPath.row)")
Run Code Online (Sandbox Code Playgroud)

我只想将缓存的图像设置到我的 imageView 中。

UIImage.image = cachedImage

无法正常工作,并且当我上下滚动时一次又一次地加载图像CollectionViewCell

或者任何其他方式执行此操作,这样我就不必一次又一次地加载带有图像的 imageView 。我的ImageView在里面UICollectionViewCell

Man*_*ear 5

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

let image: UIImage = //...
ImageCache.default.store(image, forKey: cacheKey)
Run Code Online (Sandbox Code Playgroud)

默认情况下 Kingfisher 使用url.absoluteStringas 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

但由于您在集合视图中使用它,请确保在重用 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
    }
}   
Run Code Online (Sandbox Code Playgroud)