Подтвердить что ты не робот

Что происходит с SDWebImage Cached Images в моем приложении при изменении файла изображения на сервере?

Я использую библиотеку SDWebImage для кэширования веб-изображений в своем приложении:

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

Текущее использование:

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

Мой вопрос заключается в том, что происходит после кэширования изображения, а через пару дней этот файл изображения на сервере был обновлен новым изображением?

В настоящее время мое приложение по-прежнему отображает кешированное изображение.

Я не вижу ни одной документации по установке тайм-аута кеша или того, что распознает, что размер файла изменился.

Если у кого-то есть опыт использования этой конкретной библиотеки, тогда любая помощь будет принята с благодарностью.

Спасибо заранее.

4b9b3361

Ответ 1

Я посмотрел исходный код. Он обрабатывает метод setImageWithURL следующим образом:

  • Задайте кеш в памяти, если изображение есть, если да, верните изображение и больше не ходите
  • Задайте дисковый кеш, если изображение есть, если да, верните изображение и больше не ходите
  • Попробуйте загрузить изображение, верните изображение с успехом, сохраните образ заполнителя.

Нет запроса, отправленного для запроса на удаленный сервер, если есть новая версия, в то время как на диске есть что-то старое, например, используя ETags протокол HTTP.

Копая немного глубже, время кеша устанавливается на статическое значение в SDImageCache.m

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

он не может быть изменен с помощью установщика.

До тех пор, пока изображение в кеше будет действительным, SDWebImage lib не загрузит ничего нового. Через неделю он загрузит измененное изображение.

Ответ 2

Вы можете использовать параметр options.

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

Ура!

Ответ 3

Проблема с старением SDImageCache (у которого теперь есть setter: maxCacheAge) заключается в том, что SDWebImage никогда не проактивно ничего не делает с этим. В какой-то момент вам нужно вызывать cleanDisk, чтобы очистить старые данные из кеша. Примечание. SDWebImage вызывается cleanDisk, когда приложение завершается, но приложениям не гарантируется получение уведомления о прекращении работы с ОС.

Ответ 4

    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];
    }

Ответ 5

Если вы хотите изменить продолжительность кэша по умолчанию в Swift. Установите это в своем AppDelegate.

Версия 3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS

Версия 4:

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

-

Я считаю, что это только эффекты изображения, которые являются кешами после того, как это значение установлено. IE, если ваше приложение кэширует изображение с истечением срока действия кеша по умолчанию, а затем изменит его на что-то еще, ваши изображения будут продолжать действовать только через неделю. Легкое решение этого - просто очистить кеш.

Ответ 6

Ниже я наблюдал.

  • Если имя изображения/путь одинаково, SDWebImage не будет загружать его снова в течение 1 недели.

  • Независимо от имени изображения, SDWebImage будет повторно загружать изображение через 1 неделю (с момента его загрузки).

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

  • У них есть одна База данных, в которой хранятся все URL-адреса изображений. Для них URL изображения похож на первичный ключ (уникальный ключ).

Итак, в основном, что они делают, это если URL-адрес изменен и не присутствует в БД, загрузите его.

С моей точки зрения, что они делают, ПРАВИЛЬНО. Ex. Если вы загружаете изображение, пусть говорят для пользователя A, имя изображения должно быть изменено, и это базовое. Я знаю, что некоторые разработчики предпочитают, чтобы имя изображения было таким же (например, userA.png).

Ответ 7

SDWebImage делает агрессивное кэширование по умолчанию. Но теперь они дают возможность уважать ваши заголовки управления кешированием HTTP и получать последнее изображение.

Для этого у них есть новый метод, в котором в параметрах вы можете передать SDWebImageRefreshCached

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

Подробные сведения и объяснения метода можно найти здесь здесь.

Ответ 8

Последние версии Swift 3.0 * и SDWebImage

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

Ответ 9

Как я читал в режиме чтения SDWeb в git, Это может помочь:

В вашем случае вы можете использовать флаг SDWebImageRefreshCached. Это немного ухудшит производительность, но будет учитывать заголовки управления кешированием HTTP:

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