web-dev-qa-db-ja.com

サーバー上の画像ファイルが変更されると、アプリのSDWebImageキャッシュ画像はどうなりますか?

私はSDWebImageライブラリを使用して、アプリのWebイメージをキャッシュしています。

https://github.com/rs/SDWebImage/blob/master/README.md

現在の使用法:

[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

私の質問は、画像がキャッシュされ、数日後にサーバー上の画像ファイルが新しい画像で更新されるとどうなりますか?

現時点では、アプリケーションはまだキャッシュされた画像を表示しています。

キャッシュタイムアウトの設定に関するドキュメントや、ファイルサイズが変更されたことを認識するものはありません。

この特定のライブラリを使用した経験がある人は、どんな助けでも大歓迎です。

前もって感謝します。

48
fuzz

私はソースコードを見ました。次のようにsetImageWithURLメソッドを処理します。

  1. 画像が存在するかどうかをメモリキャッシュに問い合わせ、はいの場合は画像を返し、それ以上先に進まないでください
  2. イメージが存在するかどうかをディスクキャッシュに確認し、存在する場合はイメージを返し、それ以上先へ進まないでください
  3. 画像をダウンロードして成功時に画像を返すか、プレースホルダー画像を保持してください

HTTPプロトコルの ETags を使用するなど、ディスク上に古いバージョンがある場合に、新しいバージョンがあるかどうかをリモートサーバーに問い合わせる要求は送信されません。

キャッシュ時間をもう少し掘り下げると、SDImageCache.mの静的な値に設定されます

static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week

セッターで変更することはできません。

そのため、キャッシュ内のイメージが有効である限り、SDWebImage libは新しいものをダウンロードしません。 1週間後、変更された画像がダウンロードされます。

64
Nick Weaver

optionsパラメーターを使用できます。

Swiftバージョン:

imageView.sd_setImage(with: URL(string: URLWithString:profilePictureUrl),
                      placeholderImage: UIImage(named: "placeholder"),
                      options: .refreshCached,
                      completed: nil)

Objective-Cバージョン:

[imageView sd_setImageWithURL:[NSURL URLWithString:profilePictureUrl]
             placeholderImage:[UIImage imageNamed:@"placeholder.png"]
             options:SDWebImageRefreshCached
             completed: nil];

乾杯!

23
Pei

SDImageCacheのエージング(現在はセッター:maxCacheAgeを持っています)の問題は、SDWebImageがそれを実際にプロアクティブに実行しないことです。キャッシュから古いデータを削除するには、ある時点で自分でcleanDiskを呼び出す必要があります。注:SDWebImageはアプリの終了時にcleanDiskを呼び出しますが、アプリはOSから終了通知を受け取ることを保証されていません。

10
Mark Krenek
    NSURL *imageUrl = nil;
    NSDate *lastUpdate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastUpdate"];
    NSDate *currentDate = [NSDate date];

    if (lastUpdate == nil 
        || ![lastUpdate isKindOfClass:[NSDate class]] 
        || [currentDate timeIntervalSinceDate:lastUpdate] > 60 * 60 *24) {
            [[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"lastUpdate"];
            NSString *urlString = [NSString stringWithFormat:@"http://yourdomain.com/image/image.png?%f", [currentDate timeIntervalSince1970]];
            imageUrl = [NSURL URLWithString:urlString];
    }
7
kukat

Swiftでデフォルトのキャッシュ期間を変更する場合。これをAppDelegateで設定します。

バージョン3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS

バージョン4:

SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS

-

これは、この値が設定された後のキャッシュである画像にのみ影響すると思います。 つまり、アプリがデフォルトのキャッシュ有効期限で画像をキャッシュしてから別のものに変更した場合、画像は1週間後に期限切れになります。簡単な解決策これには、キャッシュをクリアするだけです。

6
Krtko

SDWebImageはデフォルトでアグレッシブキャッシングを実行します。しかし、HTTPキャッシングコントロールヘッダーを尊重し、最新の画像を取得するオプションを提供するようになりました。

このため、オプションでSDWebImageRefreshCachedを渡すことができる新しいメソッドがあります

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

完全なメソッドの詳細と説明を見つけることができます こちら

4
Gautam Jain

以下は私が観察したものです。

  1. イメージ名/パスが同じ場合、SDWebImageは1週間それを再度ダウンロードしません。

  2. SDWebImageは、イメージ名に関係なく、1週間後に(ダウンロードされてから)イメージを再ダウンロードします。

    static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week

  3. すべての画像URLが保存される1つのデータベースがあります。彼らにとって、画像URLは主キー(一意のキー)のようなものです。

だから基本的に彼らがすることは、URLが変更されてDBに存在しない場合、それをダウンロードすることです。

私の観点からは、彼らがしていることは正しいことです。例画像をアップロードする場合、ユーザーAの場合、画像名を変更する必要があります。これは基本的なことです。一部の開発者は同じ画像名を好むことを知っています(常にuserA.pngなど)。

4
Fahim Parkar

SDWebImageフロー:

1)SDWebImageは、サーバーから取得した画像をキャッシュします

2)SDWebImage使用urlはキャッシュから画像を取得するためのキーです

3)SDWebImageチェック:

キャッシュから画像を取得するためにableの場合-OK

if no(例:urlが変更された)-キャッシュから画像を取得できません

そのため、実際には空のImageViewを取得し、SDWebImageはサーバーから画像を再度取得する必要があります

3
Svitlana

最新Swift 3.0 *およびSDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
2
Urvish Modi

GitのSDWebのreadmeを読んでいると、次のことが役立つかもしれません。

あなたの場合、SDWebImageRefreshCachedフラグを使用できます。これはパフォーマンスをわずかに低下させますが、HTTPキャッシングコントロールヘッダーを尊重します。

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