2017-06-17 63 views
0

我正在使用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的天气应用程序教程)

+1

你需要把你的调用放到'responseJSON'闭包内的'completed',而不是放在它后面。 – Rob

+0

哇谢谢,它现在有效。 – Mat

+1

顺便提一下,这里并不重要,但是在这里人们通常会将这三个解析的值作为参数放在'DownloadComplete'' typealias'中,而不是在这里设置城市名称,天气类型和当前临时属性的属性,然后通过这些当你调用'completed'时返回值。例如。 'typealias DownloadComplete =(_ city:String?,_ weather:String?,_ temperature:Float?,_ error:Error?) - > Void'。执行网络请求的代码可能不应该混淆模型对象。您还想让来电者决定要做什么并识别错误) – Rob

回答

0

更新:它仅仅是在responseJSON闭合内移动completed