簡體   English   中英

當服務器上的圖像文件發生變化時,我的應用程序中的SDWebImage緩存圖像會發生什么?

[英]What happens to SDWebImage Cached Images in my app when the image file on the server changes?

我正在使用SDWebImage庫來緩存我的應用程序中的Web圖像:

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

目前的用法:

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

我的問題是,一旦圖像被緩存后會發生什么,然后幾天后,服務器上的圖像文件已用新圖像更新?

目前我的應用程序仍在顯示緩存的圖像。

我無法在任何有關設置緩存超時的文檔中看到或者識別出文件大小已更改的內容。

如果有人有使用這個特定庫的經驗,那么任何幫助將不勝感激。

提前致謝。

我看了一下源代碼。 它像這樣處理setImageWithURL方法:

  1. 詢問內存緩存是否有圖像,如果是,則返回圖像,不再繼續
  2. 詢問磁盤緩存是否有圖像,如果是,則返回圖像,不再繼續
  3. 嘗試下載圖像,成功返回圖像,否則保留占位符圖像

如果存在新版本而沒有請求遠程服務器的請求,而磁盤上存在舊版本,例如使用HTTP協議的ETag

深入挖掘緩存時間在SDImageCache.m中設置為靜態值

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

它不能用setter改變。

因此,只要緩存中的圖像有效, SDWebImage lib就不會下載任何新內容。 一周后,它將下載您更改的圖像。

您可以使用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老化的問題(現在有一個setter:maxCacheAge)是SDWebImage從未真正主動對它做任何事情。 您需要在某些時候自己調用cleanDisk以從緩存中清除舊數據。 注意:當應用程序終止時,SDWebImage會調用cleanDisk,但不保證應用程序從操作系統獲得終止通知。

    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

-

我相信這只會影響設置此值后緩存的圖像。 IE如果你的應用程序緩存具有默認緩存過期的圖像,然后將其更改為其他內容,則您的圖像仍將在一周后過期。 一個簡單的解決方案就是清除緩存。

以下是我觀察到的情況。

  1. 如果圖像名稱/路徑相同,SDWebImage將不會再次下載1周。

  2. 無論圖像名稱如何,SDWebImage將在1周后重新下載圖像(從下載時開始)。

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

  3. 他們有一個數據庫,其中存儲了所有圖像URL。 對於他們來說,圖像URL就像主鍵(唯一鍵)。

所以他們基本上做的是如果URL被更改而不存在於DB中,請下載它。

從我的觀點來看,他們正在做的是正確的。 防爆。 如果您為用戶A上傳圖片,則必須更改圖片名稱,這是基本的。 我知道一些開發人員更喜歡圖像名稱相同(如userA.png總是)。

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緩存從服務器檢索的圖像

2) SDWebImage使用url是從緩存中獲取圖像的關鍵

3) SDWebImage檢查:

如果它能夠從緩存中獲取圖像 - 好的

如果沒有 (例如url被更改) - 無法從緩存中獲取圖像

實際上,您將獲得空的ImageView, SDWebImage必須再次從服務器檢索圖像

最新的Swift 3.0 *和SDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)

當我在git中閱讀SDWeb自述文件時,它可能有所幫助:

在您的情況下,您可以使用SDWebImageRefreshCached標志。 這會稍微降低性能,但會尊重HTTP緩存控制標頭:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM