直接用 kingfisher 将 UIImage 设置为 UIImageView
Set UIImage to UIImageView directly with kingfisher
我想直接用 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。我的 ImageView
在 UICollectionViewCell
里面
您可以通过以下方式将现有图像存储在 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
存储在单元格中,当向我们缓存 return 图像时,我们确保该单元格尚未被重用并且仍然需要该图像。如果单元格重复使用,那么在 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
}
}
我想直接用 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。我的 ImageView
在 UICollectionViewCell
您可以通过以下方式将现有图像存储在 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
存储在单元格中,当向我们缓存 return 图像时,我们确保该单元格尚未被重用并且仍然需要该图像。如果单元格重复使用,那么在 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
}
}