处理Alamofire的异步调用
问题描述:
我正在使用Swift 3和XCode 8处理Alamofire的异步调用
我对IOS开发和使用Swift很新颖。我目前遇到一些问题,在异步调用成功完成后,一些必需的代码无法运行。
在我的常量文件:
typealias DownloadComplete =() ->()
在我WeatherVC.swift文件:
var currentWeather = CurrentWeather()
override func viewDidLoad() {
super.viewDidLoad()
TableView.delegate = self
TableView.dataSource = self
currentWeather.downloadWeatherDetails{
//setup UI to load downloaded data
print("Done 2")
self.updateMainUI()
}
}
在我CurrentWeather.swift类:
func downloadWeatherDetails(completed: @escaping DownloadComplete){
//Alamofire download
let currentWeatherURL = URL(string: CURRENT_WEATHER_URL)!
Alamofire.request(currentWeatherURL).responseJSON { response in
let result = response.result
if let dict = result.value as? Dictionary<String, AnyObject>{
if let name = dict["name"] as? String{
self._cityName = name.capitalized
print(self._cityName)
}
if let weather = dict["weather"] as? [Dictionary<String, AnyObject>]{
if let main = weather[0]["main"] as? String{
self._weatherType = main.capitalized
print(self._weatherType)
}
}
if let main = dict["main"] as? Dictionary<String, AnyObject>{
if let currentTemperature = main["temp"] as? Double {
let kelvinToCelsius = currentTemperature - 273.15
self._currentTemp = kelvinToCelsius
print(self._currentTemp)
}
}
}
print("Done 1")
}
completed() //Make sure to tell download is done
}}
当执行代码“完成2“在”完成1“之前首先被打印出来,当我希望它是相反的。
我该如何解决这个问题? (FYI:关于Udemy的天气应用程序教程)
答
更新:它仅仅是在responseJSON
闭合内移动completed
。
你需要把你的调用放到'responseJSON'闭包内的'completed',而不是放在它后面。 – Rob
哇谢谢,它现在有效。 – Mat
顺便提一下,这里并不重要,但是在这里人们通常会将这三个解析的值作为参数放在'DownloadComplete'' typealias'中,而不是在这里设置城市名称,天气类型和当前临时属性的属性,然后通过这些当你调用'completed'时返回值。例如。 'typealias DownloadComplete =(_ city:String?,_ weather:String?,_ temperature:Float?,_ error:Error?) - > Void'。执行网络请求的代码可能不应该混淆模型对象。您还想让来电者决定要做什么并识别错误) – Rob