Как узнать, когда в iOS выполняются параллельные HTTP-запросы?

Мне нужно запустить некоторый код только после запроса нескольких HTTP-ресурсов для сбора некоторых данных.

Я прочитал много документации, и я узнал, что должен использовать GCD и группы отправки :

  1. Создайте группу с dispatch_group_create()
  2. Для каждого запроса:
    • Введите группу отправки с dispatch_group_enter()
    • Запустить запрос
    • Получив ответ, оставьте группу с dispatch_group_leave()
  3. Подождите с dispatch_group_wait()
  4. Отпустите группу dispatch_release()

Тем не менее я не уверен, что эта практика может иметь некоторые подводные камни – или есть ли лучший способ подождать, когда будут завершены запросы на параллели?

Приведенный ниже код выглядит хорошо:

  // Just send a request and call the when finished closure func sendRequest(url: String, whenFinished: () -> Void) { let request = NSMutableURLRequest(URL: NSURL(string: url)) let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in whenFinished() }) task.resume() } let urls = ["http://example.com?a", "http://example.com?b", "http://example.com?c", "http://example.com?d", "http://invalid.example.com"] var fulfilledUrls: Array<String> = [] let group = dispatch_group_create(); for url in urls { dispatch_group_enter(group) sendRequest(url, { () in fulfilledUrls.append(url) dispatch_group_leave(group) }) } dispatch_group_wait(group, DISPATCH_TIME_FOREVER); for url in fulfilledUrls { println(url) } 

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

  • PFLoginViewController не показывает кнопку входа в Facebook с Swift
  • Отключение анимации segue
  • Отключить анимацию UISearchController
  • Кнопка действия не отображается в уведомлении iOS 10
  • Как я могу одновременно отображать несколько диспетчеров отображения на экране UIPageViewController
  • Контекстный тип «NSFastEnumeration» не может использоваться с литералом массива
  • Как вызвать функцию Generic через Selector во время выполнения в Swift?
  • UICollectionViewCell остается черным при использовании с SDWebImage
  • NavigationController не нажимает на вызов функции + быстрый
  • как конвертировать список RealmSwift в результаты?
  • Преобразование широты и долготы MapKit в формат DMS
  • Interesting Posts

    Как отделить emojis, введенный (через клавиатуру по умолчанию) в текстовое поле

    Обнаружение текущего элемента в AVQueuePlayer и знание его изменений?

    Обновление сертификатов разработки и распространения. Должен ли я использовать один и тот же CSR для обоих?

    Конвертировать удалять границу навигации

    Как заставить постоянные отношения между мужчинами и женщинами оставаться постоянными

    Разница между использованием xib и добавлением через код – iPhone

    Ячейки в UITableView перекрываются. Многие ячейки в одном месте

    Используйте различные сервисы GoogleService-Info.plist для разных схем сборки

    cognito – Доступ к Identity запрещен

    Запись аудио и волновой формы на ios

    performBlockAndWait В дочернем контексте с закрытыми овальными очередями Родитель на iOS 7

    Невозможно получить данные с использованием данных ядра

    Пользовательский UITableViewCell программно с использованием Swift

    Разностное поведение didReceiveRemoteNotification между производством и развитием APNS

    Сортировка одного массива в том же порядке, что и другой массив

    Давайте будем гением компьютера.