Alamofire无法更新类属性数据

时间:2017-07-13 08:12:01

标签: ios swift

您好我正在尝试使用alamofire下载json天气数据。 这是我的代码,工作版本:

class WeatherModel {
  private var _date: String?
  private var _location: String?
  private var _weatherType: String?
  private var _temperature: Double?

  func getWeatherInfoFromAPI(completed: @escaping ()-> ()) {
    let url = URL(string: WEATHER_URL)!
    Alamofire.request(url).responseJSON(completionHandler: { response in
    // Test updating data
    self._temperature = 25
    self._weatherType = "Clear"
    self._location = "Vietnam"
    completed()
    })

  }
}

- >这样,我就可以更新类的属性。

无法更新getWeatherInfoFromAPI函数的类属性版本:

      func getWeatherInfoFromAPI(completed: @escaping ()-> ()) {
        let url = URL(string: WEATHER_URL)!
        Alamofire.request(url).responseJSON{ response in
        // Test updating data
        self._temperature = 25
        self._weatherType = "Clear"
        self._location = "Vietnam"  
    }
    completed()
  }

所以,我不知道它们之间有什么区别。请帮我澄清两种方法。

Alamofire.request(url).responseJSON(completionHandler: { response in })

Alamofire.request(url).responseJSON{ response in }

我的代码不起作用的原因是什么?因为我看到Alamofire文档也像第二种方式一样使用!我正在考虑他们之间的线程差异

另外,我怎么知道代码在responseJSON中运行的是什么线程?

谢谢,感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:1)

这两种方式在功能上是相同的,第二种方法只使用Swift的尾随闭包语法。

你在completed()做什么?因为在第一个示例中,您在完成网络呼叫时呼叫它,而在第二种情况下,您在开始网络呼叫后立即呼叫它 - 呼叫尚未完成。你应该在Alamofire回调中打电话,就像在第一个例子中一样。在第二个示例中,如果您正在completed内检查这些属性,那么难怪他们还没有更新。