Кэширование изображений - Как контролировать, когда изображения располагаются? - PullRequest
0 голосов
/ 16 мая 2018

Мне нужно кэшировать изображения на диске, но ограничить их, скажем, до 20 изображений. Я пытаюсь Nuke библиотека. Когда я бегу

Nuke.loadImage(with: url, options: options, into: imageView)

изображение кэшируется, пока я нахожусь внутри моего View Controller. Когда я покидаю просмотры, изображения в следующий раз загружаются снова. Так как же заставить Nuke (или другую библиотеку) сохранить эти изображения для определенного количества изображений или времени.

Перед попыткой Nuke я просто сохранял изображения в папке «Документы» приложения каждый раз, когда получаю изображение. Я уверен, что есть лучший способ.

Обновление: я смог сделать это с Kingfisher.

func getFromCache(id: String) {
    ImageCache.default.retrieveImage(forKey: id, options: nil) {
        image, cacheType in

        if let image = image {
            self.galleryImageView.image = image  
        } else {
            print("Not exist in cache.")
            self.loadImage()
        }
    }
}

private func loadImage() {            
    ImageDownloader.default.downloadImage(with: url, options: [], progressBlock: nil) {
        (image, error, url, data) in

        if let image = image {
            self.galleryImageView.image = image
            ImageCache.default.store(image, forKey: id, toDisk: true)
        }
    }
}

Если я правильно понимаю, сначала retrieveImage извлекает изображения из дискового кэша. Позже из кеша памяти. И это освобождает их только при получении предупреждения памяти. Я надеюсь, что это так. Боже, помоги нам.

1 Ответ

0 голосов
/ 24 августа 2018

Есть несколько расширенных опций для кэширования изображений.Вы можете получить прямой доступ к Memory Cache (по умолчанию Nuke's ImagePipeline имеет два слоя кэша):

// Configure cache
ImageCache.shared.costLimit = 1024 * 1024 * 100 // Size in MB
ImageCache.shared.countLimit = 20 // You may use this option for your needs 
ImageCache.shared.ttl = 90 // Invalidate image after 90 sec

// Read and write images
let request = ImageRequest(url: url)
ImageCache.shared[request] = image
let image = ImageCache.shared[request]

// Clear cache
ImageCache.shared.removeAll()

Также используйте класс ImagePreheater.Подогрев (или предварительная выборка) означает загрузку изображений заранее в ожидании их использования.Nuke lib предоставляет класс ImagePreheater, который делает именно это:

let preheater = ImagePreheater(pipeline: ImagePipeline.shared)

let requests = urls.map {
    var request = ImageRequest(url: $0)
    request.priority = .low
    return request
}

// User enters the screen:
preheater.startPreheating(for: requests)

// User leaves the screen:
preheater.stopPreheating(for: requests)

Вы можете использовать Nuke lib в сочетании с библиотекой Preheat, которая автоматизирует предварительный нагрев содержимого в UICollectionView и UITableView.На iOS 10.0 и выше вы можете использовать вместо этого новые API предварительной загрузки, предоставляемые iOS.

...