Как узнать, когда в 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 вызовет блок, когда группа завершит без блокировки вызывающего потока в промежуточный период.

  • Как добавить searchBar с областью видимости в пределах NavigationBar, где navBar автоматически увеличивает свою высоту и показывает область видимости
  • Автоматическое расположение, как скрыть 1 вид в представлении с 3 равными представлениями ширины
  • Как использовать кнопку раскрытия подробностей в UICollectionViewCell?
  • Когда вы отлаживаете код Swift, могу ли я получить типизированную ссылку на объект, указанный только по его адресу?
  • Вручную перемещать узел за определенный промежуток времени
  • Включить некоторые части UILabel, чтобы действовать как UIButton?
  • Как вы используете оболочку связки ключей для слесаря
  • Как проверить, что строка начинается с (префикс) или заканчивается (суффикс) в Swift
  • Оператор участника '%' должен иметь хотя бы один аргумент типа 'ViewController'
  • FirebaseTableViewDataSource вылетает при выводе пользователя и подписании
  • Отправить SMS с Twilio в Swift
  • Давайте будем гением компьютера.