Я пытаюсь загрузить и кэшировать 122 веб-(анимированных) изображения, а затем показать их в коллекции с помощью ReusableCell.
Поскольку я использую изображения webp, я чувствую, что в настоящее время не так много библиотек, которые я мог бы использовать. Единственный, который я нашел, который поддерживает анимацию - это SDWebImage .
Я просматривал каждое сообщение с тегом "SDWebImage" и видел несколько похожих вопросов с ответом, но ни один из них не помог мне добраться туда, где я хочу быть.
Хорошо, теперь немного кода.
Я использую этот двумерный массив с url: s для разных изображений, чтобы проверить загрузку изображения
var images: [[URL]] = [[URL(string: "img00")!, URL(string: "img01")!], [URL(string: "img10")!, URL(string: "img11")!]]
Причина этого в том, что мой collectionView имеет 2 раздела и 2 строки atm.
Чтобы иметь возможность использовать webp, я начинаю с добавления WebPCoder в viewDidLoad
override func viewDidLoad() {
let WebPCoder = SDImageWebPCoder.shared
SDImageCodersManager.shared.addCoder(WebPCoder)
}
Как вы можете видеть ниже, я использую sd_setImage с одним из URL: s,
если я правильно понимаю, это сначала проверит, кэшировано ли изображение, в противном случае оно начнет загружать изображение, а затем кэширует его.
В то время как изображение загружается, я показываю изображение заполнителя.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CollectionViewCell.reuseID, for: indexPath) as? CollectionViewCell else {
return UICollectionViewCell()
}
let url = images[indexPath.section][indexPath.row]
cell.profileImage?.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholderImg.png"))
return cell
}
Теперь о проблемах, которые у меня есть.
При чтении документов в SDWebImageView этого будет достаточно. (Если я что-то пропустил)
Через пару секунд каждая ячейка начнет обновлять свой образ до загруженного. По одному. Обычно для завершения всех 4 изображений требуется около 4–5 секунд.
Теперь, когда я перейду к другому виду, а затем вернусь снова. Кажется, что нет загрузки вообще. Я полагаю, что это потому, что SDWebImage сохраняет каждое изображение в кэш-память.
Теперь, если я полностью убью приложение и перезапущу его
загрузка изображений снова занимает 4-5 секунд.
Я не уверен, загружаю ли я их снова или же библиотеке требуется столько времени, чтобы получить изображения из дискового кэша.
То, чего я хотел бы достичь, это следующее:
Пользователь запускает приложение в первый раз и отображается приветствие.
Пользователь не может отклонить welcomeView, пока приложение не завершит загрузку всех изображений, скажем (122 изображения)
Когда все изображения были загружены, я представляю коллекцию View view
и все изображения уже загружены.
В следующий раз пользователь запускает приложение. Я не хочу, чтобы приложение снова загружало все изображения, оно должно мгновенно заполнять ячейки изображениями из кэша. Или, по крайней мере, очень быстро. Я мог бы снова иметь «welcomeView», но ненадолго.
Я пытался выполнить это с помощью SDWebImagePrefetcher.
(изображения - это тот же двумерный массив из предыдущих)
SDWebImagePrefetcher
.shared
.prefetchURLs(
images as [URL],
progress: nil,
completed: { finished, skipped in
// Navigate to view with collectionView
}
)
Это занимает пару секунд, но затем collectionView мгновенно показывает изображения.
Но я не верю, что он получает изображения из кеша диска или вообще из любого кеша. Он просто снова загружает изображения и помещает их в «кэш временной памяти».
И если я полностью закрою приложение, оно снова будет таким же.
Итак, мой вопрос, как мне справиться с чем-то вроде этого? Я на правильном пути или я совершенно не прав?
Мне кажется, что изображения не сохраняются в кэш-памяти диска, а только временно в памяти.
Является ли SDWebImage подходящей библиотекой для этого, или я должен использовать другую библиотеку / создать свою собственную?
Спасибо, что прочитали мой вопрос. Надеюсь, я смогу получить некоторые ответы из этого поста или несколько указаний.