Я хочу понять, как загрузить и отобразить несколько изображений для collectionView - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь загрузить и кэшировать 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 подходящей библиотекой для этого, или я должен использовать другую библиотеку / создать свою собственную?

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

...