Должен ли я использовать очередь операций для этого полного сценария?

Мне нужно выполнить сценарий со следующими шагами:

  1. Чтобы сделать сетевой вызов с некоторыми параметрами поиска, предоставленными пользователем
  2. Затем, чтобы проанализировать его ответ JSON и создать объекты модели
  3. Затем для каждого созданного объекта и, если у него есть связанный URL-адрес изображения, вызвать соответствующую службу для загрузки такого изображения и показать его в UICollectionView после завершения загрузки.

Мне нужно обрабатывать одновременные сетевые вызовы при загрузке N изображений, которые мне нужны. Пользователь должен иметь возможность отменить текущий поток поиска и начать новый. Кроме того, я должен учитывать, что ячейка для определенного изображения еще не отображалась или была удалена из очереди. Итак, мой вопрос: что было бы лучшим подходом для этого?

  • Выполните первый сетевой вызов (без параллелизма) и синтаксический анализ ответа JSON напрямую, используя URLSession и URLSessionDownloadTask, и используя Operation и OperationQueue для последующих шагов. Используйте как invalidateAndCancel() для URLSession, так и cancelAllOperations() для OperationQueue, если пользователь хочет отменить текущий поиск.
  • Выполните весь процесс, используя Operation и OperationQueue.
  • Есть ли другой и более подходящий подход?

person AppsDev    schedule 22.12.2016    source источник
comment
Для последующих сетевых вызовов, поскольку они не имеют зависимости или приоритета среди них, использование NSOperationQueue (чье основное преимущество в этом случае, о котором я могу думать, это зависимость и приоритет), я считаю, не добавляет никакой ценности. Вы можете запускать несколько задач данных NSURLSession, а затем вызывать invalidateAndCancel для URLSession имеет смысл. Однако для загрузки изображения и отображения его в CollectionView я предпочитаю использовать SDWebImage. Он активно кэширует, загружает изображение и самостоятельно обновляет пользовательский интерфейс, эффективно отображает изображение в collectionView/tableView: D   -  person Sandeep Bhandari    schedule 22.12.2016


Ответы (2)


Лучшим подходом было бы выполнить либо синхронный, либо асинхронный вызов, чтобы сделать первый вызов службы. После завершения синхронно проанализируйте json, а затем используйте концепцию ленивой загрузки (асинхронный вызов) для загрузки, если какие-либо изображения должны быть загружены для отображения изображений.

person NKB    schedule 22.12.2016
comment
Синхронизация сетевого звонка !!! Хм, интересно, какой API NSURLSession выполняет синхронный вызов??? Насколько я знаю, Synchronous API для сетевого вызова не существует. - person Sandeep Bhandari; 22.12.2016
comment
Не NSURLSession. NSURLSession или URLSession — это полностью асинхронный вызов службы. Вы можете использовать NSURLConnection, который устарел. Хотя я не вижу в этом необходимости. - person NKB; 22.12.2016
comment
Извините, возможно, заголовок моего вопроса был немного запутанным... на самом деле мой вопрос касается использования URLSessions или (асинхронного) Operationss - person AppsDev; 22.12.2016
comment
URLSession для вызова службы и Operation queue/URLSession для загружаемых изображений. - person NKB; 22.12.2016

Выполните сетевой вызов, затем сделайте объекты модели. верните их в свой VC через блок завершения API.

Затем перезагрузите представление коллекции и передайте URL-адрес каждой ячейке, и каждая ячейка будет беспокоиться о себе, используйте что-то вроде SDWebImage, чтобы отображать изображения асинхронно в ячейках.

person Sean Lintern    schedule 22.12.2016