49

ライブラリを使用SDWebImageして、アプリにWeb画像をキャッシュしています。

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

現在の使用法:

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

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

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

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

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

前もって感謝します。

4

10 に答える 10

66

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

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

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

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

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

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

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

于 2011-05-24T08:44:01.927 に答える
26

パラメータを使用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];

乾杯!

于 2013-12-20T09:01:41.253 に答える
10

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

于 2013-01-05T14:20:33.000 に答える
7
    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];
    }
于 2011-09-06T05:04:51.627 に答える
7

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

バージョン3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS

バージョン4:

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

-

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

于 2015-09-10T05:15:49.757 に答える
4

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

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

  2. 画像名に関係なく、SDWebImageは1週間後に画像を再ダウンロードします(ダウンロードされた時点から)。

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

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

つまり、基本的には、URLが変更され、DBに存在しない場合は、ダウンロードします。

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

于 2014-09-30T08:03:59.100 に答える
4

SDWebImageは、デフォルトでアグレッシブキャッシュを実行します。しかし今では、HTTPキャッシング制御ヘッダーを尊重して最新の画像を取得するオプションが提供されています。

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

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

完全なメソッドの詳細と説明はここにあります

于 2015-08-24T10:14:59.550 に答える
3

最新のSwift3.0*およびSDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
于 2017-08-03T04:08:42.390 に答える
3

SDWebImageフロー:

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

2)SDWebImageURLを使用してキャッシュから画像を取得するための鍵

3)SDWebImage チェック:

キャッシュから画像を取得できる場合-OK

いいえの場合(たとえば、URLが変更された場合)-キャッシュから画像を取得できません

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

于 2018-05-04T00:18:07.130 に答える
1

gitのSDWebreadmeで読んだように、それは役立つかもしれません:

あなたの場合、あなたはSDWebImageRefreshCached旗を使うかもしれません。これによりパフォーマンスがわずかに低下しますが、HTTPキャッシング制御ヘッダーは尊重されます。

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
                 placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                          options:SDWebImageRefreshCached];
于 2016-02-22T06:33:47.587 に答える