Ich bin mit Swift 3 mit XCode 8Handhabung Asynchronous Call by Alamofire
Ich bin ziemlich neu für IOS Entwicklung und Verwendung von Swift. Ich habe derzeit ein Problem, bei dem einige erforderliche Codes nicht ausgeführt werden, nachdem der asynchrone Aufruf erfolgreich abgeschlossen wurde.
In meiner Konstanten file:
typealias DownloadComplete =() ->()
In meiner WeatherVC.swift Datei:
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()
}
}
In meiner CurrentWeather.swift Klasse:
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
}}
Wenn Ausführen des Codes " Done 2 "wird zuerst ausgedruckt, bevor" Done 1 ", wenn es umgekehrt sein soll.
Wie kann ich das beheben? (FYI: Folgende Wetter App Tutorial auf Udemy)
Sie müssen Ihren Aufruf innerhalb des 'responseJSON'-Abschlusses auf" completed "setzen, nicht danach. – Rob
Wow Danke, es funktioniert jetzt. – Mat
BTW, das ist hier nicht kritisch, aber anstatt die Eigenschaften für den Städtenamen, den Wettertyp und die aktuellen Temp-Eigenschaften hier einzustellen, würden Leute diese drei geparsten Werte oft als Parameter in den 'DownloadComplete'' Typealias' angeben und diese dann weitergeben Werte zurück, wenn Sie 'completed' aufrufen. Z.B. 'typalias DownloadComplete = (_ Ort: String ?, _ Wetter: String ?, _ Temperatur: Float ?, _ Fehler: Fehler?) -> Void'. Der Code, der Netzwerkanforderungen ausführt, sollte wahrscheinlich nicht mit Modellobjekten herumspielen. Sie möchten auch den Anrufer entscheiden lassen, was zu tun ist und Fehler zu identifizieren) – Rob