Вы должны использовать группы отправки, вводя группу перед выдачей запроса и оставляя группу в обработчике завершения запроса. Итак, давайте предположим, что на секунду у вас был какой-то метод, который выполнял асинхронный запрос, но предоставил параметр обработчика завершения, который был бы закрыт, который будет вызываться при выполнении сетевого запроса:
func perform(request: URLRequest, completionHandler: @escaping () -> Void) { ... }
Чтобы запустить эти два одновременных запроса и получить уведомление, когда они будут выполнены, вы сделаете что-то вроде:
let group = DispatchGroup()
group.enter()
perform(request: first) {
group.leave()
}
group.enter()
perform(request: second) {
group.leave()
}
group.notify(queue: .main) {
print("both done")
}
. Очевидно, что ваша реализация perform(request:)
может значительно различаться (например, у вас может быть закрытие передает данные назад), но шаблон тот же, независимо от того, записываете ли вы свой собственный сетевой код с помощью URLSession
или с помощью Alamofire. Просто используйте группы GCD, входящие в группу при создании запросов и оставляя группу в обработчике завершения асинхронного запроса.