web-dev-qa-db-ja.com

SDWebImageを使用してサーバーで画像が変更されたときにキャッシュ内の画像を更新する方法

SDWebImageライブラリを使用してサーバーから画像をダウンロードしています。 https://github.com/rs/SDWebImage

SDWebImageは、サーバー上で同じURLを使用して画像を更新すると、キャッシュされた画像を更新できません。

18
Shubham

SDWebImageはデフォルトでキャッシュを行うため、画像が変更された場合は新しいURLを使用することをお勧めします。したがって、たとえば、URLを制御でき、画像が変更されるたびにURLを変更できる場合、それを行うことができます。

そうでない場合は、SDWebImageRefreshCachedフィールドでoptionsを使用して、次のようにHTTPキャッシュコントロールヘッダーを尊重してください。

[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
          placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                   options:SDWebImageRefreshCached];

もっと見る こちら

16
Edgar

更新:私は実際にキャッシュ検証を含むキャッシュに関するガイド全体を書きました https://kean.github.io/blog/画像キャッシュ

SDWebImageは、NSURLCacheオプションを設定するとSDWebImageRefreshCachedを使用します。 AppleのURLロードシステムは、キャッシュされた応答の検証を含むHTTPキャッシュを実装しています。 HTTPキャッシュは非常に複雑ですが、HTTPキャッシングに関する多くの初心者向けガイドがあります。

基本的に、サーバーは各応答にHTTPキャッシュ制御ヘッダーの一部を含める必要があります。再検証を実装するために使用できるさまざまな戦略があります。 Last-ModifiedまたはETagを使用できます。このようにして、クライアントがリクエストを送信するたびに、以前にキャッシュされたレスポンスのLast-ModifiedまたはETag値をリクエストに自動的に含めます。イメージが変更されていない場合、サーバーはステータスコード302(変更されていない)で応答し、NSURLConnection/NSURLSessionNSURLCacheからキャッシュされた応答を透過的に提供します。データを再度ダウンロードする必要はありません。購入するたびに、サーバーに確認する必要があります。

HTTPキャッシュコントロールを使用して有効期限を指定することもできます。期限切れメカニズムが使用されている場合、NSURLConnection/NSURLSessionは期限切れになるまでキャッシュされた応答を再検証しません。

HTTPキャッシュ制御の詳細については、上記のリンクを参照してください。 HTTPキャッシュは、可能な限り使用する必要があるユニバーサルキャッシュメカニズムです。

画像の読み込みには Nuke フレームワークを使用することをお勧めします(免責事項:私が作成)。デフォルトではNSURLCacheを使用しますが、解凍された画像を保持するメモリキャッシュはまだあります。

12
kean

Swift 4 SDWebImageライブラリで次の関数を使用するだけです。

SDImageCache.shared().removeImage(forKey: (ImagePath), withCompletion: nil)

この関数は、メモリとディスクに保存されたキャッシュを削除します。その後、新しい画像を同時にアップロードすると、完全に機能します。

2
Remon Atef

ここにSwift 3毎回キャッシュを更新する)のコードがあります

imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)
2
Hardik Thakkar

SDWebImageManager.mファイルの行番号176に移動し、この行を変更します

if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache;

以下のコードに。

if (options & SDWebImageRefreshCached) {
      // force progressive off if image already cached but forced refreshing
      downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload;
      // remove SDWebImageDownloaderUseNSURLCache flag
      downloaderOptions &= ~SDWebImageDownloaderUseNSURLCache;
      //ignore image read from NSURLCache if image is cached but force refreshing
       downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse;
}

私にとってそれは魅力のように働きました。

1
Purnendu roy