私はSDWebImage
ライブラリを使用して、アプリのWebイメージをキャッシュしています。
https://github.com/rs/SDWebImage/blob/master/README.md
現在の使用法:
[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
私の質問は、画像がキャッシュされ、数日後にサーバー上の画像ファイルが新しい画像で更新されるとどうなりますか?
現時点では、アプリケーションはまだキャッシュされた画像を表示しています。
キャッシュタイムアウトの設定に関するドキュメントや、ファイルサイズが変更されたことを認識するものはありません。
この特定のライブラリを使用した経験がある人は、どんな助けでも大歓迎です。
前もって感謝します。
私はソースコードを見ました。次のようにsetImageWithURL
メソッドを処理します。
HTTPプロトコルの ETags を使用するなど、ディスク上に古いバージョンがある場合に、新しいバージョンがあるかどうかをリモートサーバーに問い合わせる要求は送信されません。
キャッシュ時間をもう少し掘り下げると、SDImageCache.mの静的な値に設定されます
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
セッターで変更することはできません。
そのため、キャッシュ内のイメージが有効である限り、SDWebImage
libは新しいものをダウンロードしません。 1週間後、変更された画像がダウンロードされます。
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];
乾杯!
SDImageCacheのエージング(現在はセッター:maxCacheAgeを持っています)の問題は、SDWebImageがそれを実際にプロアクティブに実行しないことです。キャッシュから古いデータを削除するには、ある時点で自分でcleanDiskを呼び出す必要があります。注:SDWebImageはアプリの終了時にcleanDiskを呼び出しますが、アプリはOSから終了通知を受け取ることを保証されていません。
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];
}
Swiftでデフォルトのキャッシュ期間を変更する場合。これをAppDelegateで設定します。
バージョン3:
SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS
バージョン4:
SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS
-
これは、この値が設定された後のキャッシュである画像にのみ影響すると思います。 つまり、アプリがデフォルトのキャッシュ有効期限で画像をキャッシュしてから別のものに変更した場合、画像は1週間後に期限切れになります。簡単な解決策これには、キャッシュをクリアするだけです。
SDWebImageはデフォルトでアグレッシブキャッシングを実行します。しかし、HTTPキャッシングコントロールヘッダーを尊重し、最新の画像を取得するオプションを提供するようになりました。
このため、オプションでSDWebImageRefreshCachedを渡すことができる新しいメソッドがあります
[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/xyz/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
完全なメソッドの詳細と説明を見つけることができます こちら 。
以下は私が観察したものです。
イメージ名/パスが同じ場合、SDWebImageは1週間それを再度ダウンロードしません。
SDWebImageは、イメージ名に関係なく、1週間後に(ダウンロードされてから)イメージを再ダウンロードします。
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
すべての画像URLが保存される1つのデータベースがあります。彼らにとって、画像URLは主キー(一意のキー)のようなものです。
だから基本的に彼らがすることは、URLが変更されてDBに存在しない場合、それをダウンロードすることです。
私の観点からは、彼らがしていることは正しいことです。例画像をアップロードする場合、ユーザーAの場合、画像名を変更する必要があります。これは基本的なことです。一部の開発者は同じ画像名を好むことを知っています(常にuserA.pngなど)。
SDWebImageフロー:
1)SDWebImage
は、サーバーから取得した画像をキャッシュします
2)SDWebImage
使用urlはキャッシュから画像を取得するためのキーです
3)SDWebImage
チェック:
キャッシュから画像を取得するためにableの場合-OK
if no(例:urlが変更された)-キャッシュから画像を取得できません
そのため、実際には空のImageViewを取得し、SDWebImage
はサーバーから画像を再度取得する必要があります
最新Swift 3.0 *およびSDWebImage
SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
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];