Хобрук: Ваш путь к мастерству в программировании

Как определить, когда все изображения были загружены из набора в Swift?

Я использую библиотеку PinRemoteImage для загрузки изображений, которые заполняют файл collectionView. Я хочу динамически обновлять высоту ячейки в зависимости от высоты изображения, поэтому мне нужно знать, когда все мои изображения загружены, чтобы я мог перезагрузить/обнулить мой collectionViewLayout. Как лучше всего определить, когда больше не осталось изображений для загрузки?

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! PinCollectionViewCell

       cell.pinImage?.pin_updateWithProgress = true
       cell.pinImage?.image = nil

        if let pinImageURL = self.pins[indexPath.row].largestImage().url {


            cell.pinImage?.pin_setImageFromURL(pinImageURL, completion: ({ (result : PINRemoteImageManagerResult) -> Void in

                if let image = result.image {
                    self.imageArray.append(image)

                }

  • Просто проверьте, что count в imageArray совпадает с count из self.pins в блоке completion. И если это так, то это означает, что они все сделали. 01.03.2016
  • Не выполняйте запрос URL-адреса при попытке отображения, вы захотите выполнить этот запрос перед попыткой отображения. Чтобы ответить на ваш вопрос, вам нужно изучить обработчики завершения. удачи 01.03.2016
  • неужели нужно ждать пока все вернут? Что, если вы получите 99 возвращенных, но один отказ? Не лучше ли обновлять отображение при каждом возврате, и дарить суэру постепенно улучшающееся отображение? 01.03.2016
  • @ Рассел, отличное замечание, я думаю, что это то направление, в котором я собираюсь двигаться, спасибо, что указали. 02.03.2016

Ответы:


1

Я никогда не использовал библиотеку изображений PinRemoteImage, но отвечая на блоки завершения, когда ваша загрузка из iCloud не работает, вызывает фон глупого процесса, а затем запускает ваше предложение завершения ДО того, как он загрузит все данные. Это выдержка из моего кода CloudKit, который мне нужно было реализовать, чтобы обойти это.

Он использует NSOperationalQueue, код здесь. Предупреждение: этот код войдет в бесконечный цикл, если какое-либо из ваших изображений не загрузится, в лучшем случае создав зомби, а в худшем остановив ваше приложение.

Обратите внимание, что self.filesQ.returnQThumbs — это подпрограмма, которая проверяет размер загруженных изображений, если они больше нуля, у нее есть единица, если они равны нулю или нулю, то она все еще загружается... она возвращает число, найденное в массиве. self.filesQ.qcount() возвращает количество изображений, которые необходимо загрузить.

func preThumb() {

    newQueue = NSOperationQueue()

    let operation2 = NSBlockOperation(block: {
        print("Downloaded, you can now use")
    })

    operation2.completionBlock = {
        print("Operation 2 completed")
    }

    let operation1 = NSBlockOperation(block: {
        var allclear = 0


        while (allclear != self.filesQ.qcount()) {
            allclear = self.filesQ.returnQThumbs().count
        }
    })

    operation1.completionBlock = {
        print("Operation 1 completed") 

        // your code to display images could go here!

        self.newQueue.addOperation(operation2)
    }

    operation1.qualityOfService  = .Background
    newQueue.addOperation(operation1)
}

Очевидно, возможно, вам не нужно запускать этот метод ДО того, как вы начнете загрузку в идеале.

01.03.2016
  • Я не уверен, что понимаю, куда идет ваша бизнес-логика? т. е. как методы, выполняющие фактическую загрузку, относятся к операции 1 и операции 2? 02.03.2016
  • Гэри, они идут параллельно. Вы запускаете операцию1, которая повторяется до тех пор, пока все изображения не будут загружены, когда она завершена, она запускает операцию 2. Тем временем ваша загрузка выполняется в отдельном потоке. Вы можете пропустить операцию2 в вашем случае и отобразить изображения на этапе завершения операции1. 02.03.2016
  • Спасибо, я имел в виду, будет ли мой метод cell.pinImage?.pin_setImageFromURL находиться внутри блока операции 1? 02.03.2016
  • Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..