#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
}