Установите UIImage для UIImageView напрямую с kingfisher - PullRequest
1 голос
/ 21 марта 2019

Я хочу установитьImage с UIImage напрямую, а не из любого источника, ресурса. У меня уже есть изображение, и я хочу установить его с кэшированием в свой imageView.

let myImage = UIImage

kingfisherView.kf.setImage(with: myImage)

Я хочу, чтобы это было сделано, как будто я установил изображение на UIImageView, т.е.

UIImageView.image = myImage

Но с кешированием

Я не загружаю изображения из источника, я сам их генерирую (Латекс). и кэшировать их с помощью

let cache = ImageCache.default

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

Я просто хочу установить это кэшированное изображение для моего imageView.

UIImage.image = cachedImage

не работает и загружает изображение снова и снова при прокрутке вверх и вниз в CollectionViewCell

Или любым другим способом сделать это так, чтобы у меня не было возможности снова и снова загружать imageView с изображением. Мой ImageView внутри UICollectionViewCell

1 Ответ

2 голосов
/ 21 марта 2019

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