Ios 如何在创建另一个请求之前等待多个嵌套请求?
我有一个刷新控件。当我把它拉下来时,我会发出两个嵌套请求,如下所示:Ios 如何在创建另一个请求之前等待多个嵌套请求?,ios,swift,alamofire,grand-central-dispatch,Ios,Swift,Alamofire,Grand Central Dispatch,我有一个刷新控件。当我把它拉下来时,我会发出两个嵌套请求,如下所示: httpClient.fetchCurrentWeather(... httpclient.fetchAnotherPartOfWeather(... delegate.showWeather(...) ) ) 我想在调用另一个组之前等待第一个组完成,因为当我这样做时,由于许多回调值更新,我的视图会闪烁 upd: 我在interactor中进行调用: func retreiveCurre
httpClient.fetchCurrentWeather(...
httpclient.fetchAnotherPartOfWeather(...
delegate.showWeather(...)
)
)
我想在调用另一个组之前等待第一个组完成,因为当我这样做时,由于许多回调值更新,我的视图会闪烁
upd:
我在interactor中进行调用:
func retreiveCurrentDailyWeatherForecast() {
guard let lat = locations?.first?.coordinate.latitude,
let lon = locations?.first?.coordinate.longitude
else { return }
httpClient.fetchCurrentWeather(
parameters: ["lat": lat,
"lon": lon, "units": "metric"],
completionHandler: { dailyWeatherResult in
switch dailyWeatherResult {
case .success(let dailyWeatherResponse):
self.httpClient.fetchCurrentHourlyWeather(
parameters: ["lat": lat,
"lon": lon, "units": "metric"],
completionHandler: { dailyWeeklyHourlyResult in
switch dailyWeeklyHourlyResult {
case .success(let dailyWeeklyHourlyResponse):
let weatherForecast =
self.modelConverter.convertWeatherForecast(dailyWeatherResponse,
dailyWeeklyHourlyResponse)
self.didRetreieveWeatherForecastFromNetwork(weatherForecast)
case .failure(let err):
print(err)
}
})
case .failure(let err):
print(err)
}
})
}
func didRetreieveWeatherForecastFromNetwork(_ weatherForecast: WeatherForecast?) {
if let weatherForecast = weatherForecast {
self.presenter.didRetreiveWeatherForecast(weatherForecast)
}
}
在这里,您不需要太高级的东西。您只需输入一个
布尔值(例如:isRequestIncomplete
)来检查是否收到了上一个请求的响应。下面是一个如何实现这一目标的示例:
if isRequestIncomplete { return }
isRequestIncomplete = true
httpClient.fetchCurrentWeather(...
httpclient.fetchAnotherPartOfWeather(...
isRequestIncomplete = false
delegate.showWeather(...)
)
)
在这里,您不需要太高级的东西。您只需输入一个布尔值(例如:isRequestIncomplete
)来检查是否收到了上一个请求的响应。下面是一个如何实现这一目标的示例:
if isRequestIncomplete { return }
isRequestIncomplete = true
httpClient.fetchCurrentWeather(...
httpclient.fetchAnotherPartOfWeather(...
isRequestIncomplete = false
delegate.showWeather(...)
)
)
我认为您没有显示足够的代码,因为您所显示的内容会满足您的要求。你是在做你在多个值上显示的代码,比如在一个循环中吗。你能展示更多你的代码吗?显示全部回调内容。@rs7,我更新了qestion。@AdamPro13,是的,请参阅上面的代码。@Alexander更新UI并包含在完成处理程序中的语句需要在主线程上执行。哪些函数更新您的UI?可能是天气?我认为您没有显示足够的代码,因为您所显示的内容会满足您的要求。你是在做你在多个值上显示的代码,比如在一个循环中吗。你能展示更多你的代码吗?显示全部回调内容。@rs7,我更新了qestion。@AdamPro13,是的,请参阅上面的代码。@Alexander更新UI并包含在完成处理程序中的语句需要在主线程上执行。哪些函数更新您的UI?可能是天气?您不需要布尔值来检查请求是否完成。完成处理程序是异步执行的。如何判断是否调用了完成处理程序?完成处理程序将按顺序执行,或者其中一个将抛出错误。所以问题在别处。@Frankenstein,我想我可以把你的答案标记为解决方案,因为现在我在调用函数时只调用了两次这些调用。我希望你理解我在这里试图传达的逻辑。你不需要布尔值来检查请求是否完成。完成处理程序是异步执行的。如何判断是否调用了完成处理程序?完成处理程序将按顺序执行,或者其中一个将抛出错误。所以问题在别处。@Frankenstein,我想我可以把你的答案标记为解决方案,因为现在我在调用函数时只调用了两次这些调用。我希望你理解我在这里试图表达的逻辑。