Причина, по которой ваш кэш не обновляется, заключается в том, что вы всегда пишете по одному и тому же пути, вы просто загружаете другое изображение.Я вижу, что вы спрашивали о создании динамического URL, который, теоретически, создаст путь к изображению, который не будет кэширован, и, следовательно, перезагрузится правильно.
Но вам не нужно этого делать.У меня был такой же случай и проблема недавно, когда я работал над приложением, которое использовало Firebase.У меня была модель плеера, в которой содержалась ссылка на аватарку.Картинка была сохранена с использованием Firebase Storage, а путь к папке был /players/\(uid)/profilePhoto.jpg
.Картинку профиля можно изменить, купив аватарку и используя камеру, чтобы сделать фотографию.И так как я каждый раз загружал в один и тот же путь хранения, мое изображение тоже не перезагружалось.
Теперь кеш SDWebImage является автоматическим - если вы не укажете другое, каждый раз, когда вы вызываете someImageView.sd_setImage(with: imageUrl)
, URL-адрес кэшируется с помощью SDImageCache.
Поэтому все, что я делаю, это удаляю изображение из кэша всякий раз, когда я получаю новую ссылку - в наблюдателе свойства didSet
изображения профиля.
/// property to store the profile picture url
internal var profilePictureUrl: String = "" {
didSet {
SDImageCache.shared().removeImage(forKey: Storage.storage().reference().child(profilePicture).fullPath, withCompletion: nil)
}
}
Теперь каждый раз, когдасвойство установлено, URL-адрес удаляется из кэша и SDWebImage должен получить его снова.Это происходит, когда вы вызываете sd_setImage(with: imageUrl)
и снова его кэшируете.
/// public property to set the profile image on the button
internal var profileImagePath: String? {
didSet {
if let path = profileImagePath {
profileButton.imageView?.sd_setImage(with: Storage.storage().reference().child(path), placeholderImage: nil, completion: { [weak self] (image, error, _, _) in
self?.profileButton.setImage(image ?? #imageLiteral(resourceName: "default-profile-pic"), for: .normal)
})
}
}
}
У меня есть кнопка, которая отображает мое изображение профиля в виде изображения.Когда я получаю новое изображение и вызываю метод для обновления вида кнопки, изображение выбирается, и, поскольку кэш больше не имеет ссылки на путь к изображению, он извлекает вновь загруженное изображение и воссоздает путь к кэшу.
Вот так я и сделал эту работу для меня.Я надеюсь, что это решит и вашу проблему.Не стесняйтесь спрашивать о любых дополнительных разъяснениях, и я сделаю все возможное, чтобы ответить.
Редактировать: Сахиль Манчанда указал мне, что я неправильно понял весь объем вопроса.
Мой ответ будет лучше всего работать на одном устройстве.
Если проблема связана с синхронизацией нескольких устройств, вы все равно можете использовать предлагаемое решение, но с некоторыми более частыми обновлениями пользовательского интерфейса - поскольку свойство profilePictureUrl
обновляется каждый раз, когда информация пользователя извлекается из Firebase, обновление может бытьзадерживается до следующего чтения информации пользователя или перезапуска приложения.
Вы также можете добавить проверку подключения перед удалением кэша, чтобы избежать потерь, вызванных задержкой пропускной способности.
Другим решением может быть использование тихих уведомлений (предназначенных для операций быстрого обновления), которые будут просто напоминать устройству, что пора очищать кэш.Вы можете использовать Firebase Cloud Messaging , если у вас нет опыта работы с серверами или OneSignal.