画像のダウンロードとキャッシュにKingfisher
ライブラリを使用しています。私は実装でいくつかの問題に直面しています:
画像はメモリとディスクの両方にキャッシュされていますか?
ディスク上にのみ画像をキャッシュするためのプロビジョニングはありますか?
私はすでにこれに関する複数の投稿を読みましたが、解決策を見つけることができませんでした。
はい、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)
}
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)
}
}
Swift 5.1、Xcode 11.3
https://stackoverflow.com/a/44354411/10579134 、以下の最新バージョン
ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes