web-dev-qa-db-ja.com

Kingfisherを使用して画像をディスクにのみキャッシュする方法は?

画像のダウンロードとキャッシュにKingfisherライブラリを使用しています。私は実装でいくつかの問題に直面しています:

  1. 画像はメモリとディスクの両方にキャッシュされていますか?

  2. ディスク上にのみ画像をキャッシュするためのプロビジョニングはありますか?

私はすでにこれに関する複数の投稿を読みましたが、解決策を見つけることができませんでした。

9
PGDev

はい、Kingfisherは画像をメモリとディスクの両方にキャッシュします。

デフォルトでは、使用されるRAMの量は制限されていません。自分で値を設定する必要があります:

ImageCache.default.maxMemoryCost = 1024 * 1024 * yourValue

ここで、1024 * 1024 * yourValueはメガピクセル単位のグローバルコストです(これは奇妙なことですが、画像のビット深度が異なる可能性があるため、メガバイトではなく、メガピクセルです)。

たとえば、私のテストでは、1024 * 1024 * 500の値で使用される最大RAMは、120MBから300MBの間で変動します。

ちなみに、これは、KingfisherにRAMを使用せず、ディスクにキャッシュするだけにするように指示する方法でもあります。

ImageCache.default.maxMemoryCost = 1

これにより、Kingfisherはディスクキャッシュのみを使用するようになります。


デバッグ方法

まず、適切なキャッシュに最大値を設定していることを確認します。たぶんあなたはカスタムキャッシュを作成しましたか?私の例は、デフォルトのキャッシュの値を設定することです。これは、他に定義されていない場合に使用されます。

また、メモリキャッシュを手動でクリアして、次の前後のRAM占有率を比較することもできます。

ImageCache.default.clearMemoryCache()

あるべきではないときに大きな画像がメモリキャッシュにあると思われる場合は、isImageCachedで確認できます。

if let result = ImageCache.default.isImageCached(forKey: imageLink) {
    print(result.cached)
    print(result.cacheType)
}
15
ayaio

imageViewを使用せずに画像を明示的にダウンロードしてキャッシュするための答えを探している人がいる場合、サンプルコードは次のとおりです。

ImageDownloader.default.downloadImage(with: imgUrl, retrieveImageTask: nil, options: [], progressBlock: nil) { (image, error, url, data) in
                    print("Downloaded Image: \(url)")
                    //cache image:
                    if let image =  image, let url = url {
                        ImageCache.default.store(image, forKey: url.absoluteString)
                    }
                }

参照: https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet

5
Van

Swift 5.1、Xcode 11.3

https://stackoverflow.com/a/44354411/10579134 、以下の最新バージョン

ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes
1
Kedar Sukerkar