Вы можете сохранить уже существующее изображение в кэше 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
внутри ячейки и когда Cache возвращает изображение вмы удостоверяемся, что ячейка еще не была повторно использована и все еще нуждается в этом изображении.Если ячейка используется повторно, то в 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
}
}