2017-06-17 2 views
0

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)

+1

Sie müssen Ihren Aufruf innerhalb des 'responseJSON'-Abschlusses auf" completed "setzen, nicht danach. – Rob

+0

Wow Danke, es funktioniert jetzt. – Mat

+1

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

Antwort

0

Update: Es war einfach nur bewegen completed innerhalb der responseJSON Schließung.