2017-07-13 78 views
1

嗨,我想使用alamofire來下載json天氣數據。 這裏是我的代碼,工作版本:Alamofire無法更新類屬性數據

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的類屬性的版本:

 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() 
    } 

所以,我不知道它們之間有什麼區別。請幫我在這裏澄清2種方法。

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

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

什麼是我的代碼不能正常工作的原因是什麼?因爲我看到Alamofire文檔也像第二種方式一樣使用!我正在考慮它們之間的線程差異

另外,我如何知道代碼在responseJSON中運行的是什麼線程?

謝謝,我感謝你的時間和幫助!

回答

1

這兩種方式在功能上是相同的,第二種方法只是使用Swift的尾隨閉包語法。

你在做什麼completed()?因爲在第一個示例中,您在網絡呼叫完成時調用它,而在第二種情況下,您在開始網絡呼叫之後立即呼叫 - 呼叫尚未完成。如果在Alamofire回調中,你應該打電話,就像第一個例子。在第二個例子中,如果您正在檢查completed中的這些屬性,那麼這也就不足爲奇了。

+0

這意味着alamofire請求在後臺啓動後,會立即返回主線程以第二種方式完成。因此它已被接收到數據 –

+0

請記住,粘貼的這兩個示例不僅在您使用的Alamofire回調語法方面不同,而且在您放置完成()調用的位置上也不相同。在第一個例子中,你將'completed()'調用放在alamofire回調函中,然後放在外面。這就是你使用的閉包語法的原因。 –

+0

真的很感謝你的幫助,它現在可以工作! –