2

我需要在磁盘上缓存图像,但将它们限制为 20 个图像。我正在尝试Nuke图书馆。当我跑

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

只要我在我的视图控制器中,图像就会被缓存。当我离开视图时,下一次将再次获取图像。那么我如何制作Nuke(或其他库)将这些图像保存为特定的图像计数或时间。

在尝试之前Nuke,我只是在每次获取图像时将图像保存到应用程序的 Documents 文件夹中。我确信有更好的方法。

更新:我能够做到这一点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从磁盘缓存中获取图像。后来从内存缓存。只有在收到内存警告时才会释放它们。我希望确实如此。上帝帮助我们。

4

1 回答 1

1

图像缓存有几个高级选项。您可以直接访问Memory Cache(默认 NukeImagePipeline有两个缓存层):

// 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类。预热(又名预取)意味着提前加载图像以供使用。Nukelib 提供了一个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)

您可以将Nukelib 与Preheat自动预热UICollectionViewUITableView. 在 iOS 10.0 及更高版本上,您可能希望改用 iOS 提供的新预取 API。

于 2018-08-24T00:29:04.483 回答