Как выполнить несколько сетевых вызовов и отправить результат только после успешного завершения?

#ios #swift #urlsession

#iOS #swift #urlsession

Вопрос:

Я хочу выполнить два сетевых вызова и хочу отправить результат обратно в viewcontroller только после успешного завершения обоих вызовов. В следующем коде я использовал логические gotCountries значения amp; gotOcceans , чтобы узнать, получил ли я ответ. Я хочу удалить эти логические флаги и убедиться, что я отправляю оба результата, используя блок завершения.

 func fetchCountries() {
    countries = Network call to get countries success
    gotCountries = true // Boolean
    if gotCountries amp;amp; gotOcceans {
        onCompletion?(self.countries, self.occeans)
    }
}

func fetchOcceans() {
    occeans = Network call to get occeans success
    gotOcceans = true // Boolean
    if gotCountries amp;amp; gotOcceans {
        onCompletion?(self.countries, self.occeans)
    }
}
  

Комментарии:

1. Как только вы получите страны, проверьте if , пусты страны или нет, если нет, то вызовите другую функцию внутри нее, fetchOceans, и как только вы получили oceans, передайте как oceans, так и countries в обработчике завершения.

Ответ №1:

DispatchGroup Для таких ситуаций было бы лучше использовать методы выполнения после завершения нескольких блоков завершения. Вот пример:

 let dispatchGroup = DispatchGroup()

func fetchContriesAndOceans() {
    fetchCountries()
    fetchOcceans()
    dispatchGroup.notify(queue: .main) {
//      execute what needs to be executed after the completion of both methods here.
        onCompletion?(self.countries, self.occeans)
    }
}

func fetchCountries() {
    dispatchGroup.enter()
//    dispatchGroup.leave() // Put this line in the completion of network call
}

func fetchOcceans() {
    dispatchGroup.enter()
//    dispatchGroup.leave() // Put this line in the completion of network call
}