这是值为
的类class CurrentWeather{
var _date:String!
var _cityName:String!
var _temp:Double!
var _weatherType:String!
var cityName:String{
if _cityName==nil{
_cityName = ""
}
return _cityName
}
var currentTemprature:Double{
if _temp==nil{
_temp = 0.0
}
return self._temp
}
var weathertype:String{
if _weatherType==nil{
_weatherType = ""
}
return _weatherType
}
var date:String{
if _date==nil{
_date = ""
}
let dateFormater=DateFormatter()
dateFormater.dateStyle = .long
dateFormater.timeStyle = .none
let currentDate = dateFormater.string(from: Date())
self._date="\(currentDate)"
return _date
}
func weatherDataDownload(completed : downloadComplete){
let weatherUrl=URL(string: constant)!
Alamofire.request(weatherUrl , method:.get).responseJSON{response in
if let dict=response.result.value as? Dictionary<String,AnyObject>{
if let name=dict["name"] as? String{
self._cityName = name.capitalized
print(name.capitalized)
}
if let weather=dict["weather"] as? [Dictionary<String,AnyObject>]{
if let main=weather[0]["main"] as? String{
self._weatherType=main.capitalized
print(main.capitalized)
}
}
if let tempr=dict["main"] as? Dictionary<String,AnyObject>{
if let temp=tempr["temp"] as? Double{
let convertedTemp=Double(round(temp-273.15))
self._temp=convertedTemp
print(convertedTemp)
}
}
}
}
completed()
}}
这是ViewController类
var currentWeatherOj = CurrentWeather()
override func viewDidLoad() {
super.viewDidLoad()
table.delegate=self
table.dataSource=self
currentWeatherOj.weatherDataDownload {
self.updateUIweather()
}
}
func updateUIweather () {
weatherType.text=currentWeatherOj.weathertype
presentDate.text=currentWeatherOj.date
presentLocation.text=currentWeatherOj.cityName
presentTemp.text="\(currentWeatherOj.currentTemprature)"
}
当我尝试调用ViewController
时,它显示我在_date
以外的计算变量中设置的默认值,但我可以在func
weatherDataDownload
内打印值我很困惑swift 3中的变量是如何起作用的。
答案 0 :(得分:1)
请参阅以下代码示例中的注释。您需要将呼叫转移到&#34; completed()&#34;
func weatherDataDownload(@escaping completed : downloadComplete) {
let weatherUrl=URL(string: constant)!
Alamofire.request(weatherUrl , method:.get).responseJSON { response in
// ... leave your code here alone
// put the call to completed() here
completed()
}
// not here
}
当您将所有内容发送给Alamofire时,它会在后台线程上执行它的请求。当该请求完成时,它会调用您已定义的闭包(启动&#34;在......&#34中的响应;)。你不想打电话给updateUIweather
,直到完成,所以你把电话打到&#34;完成()&#34;在同一个完成处理程序内部。
当对completed
的调用超出该完成处理程序时,它会立即被调用...在Alamofire请求发送之后立即调用(但在它完成该后台线程之前)。完成处理程序中的所有代码都没有运行,因此您的变量尚未更新。
最后因为你的completed
闭包被传递给了一个块然后被发送到后台线程,那个闭包&#34;逃脱&#34;当前的功能。你添加@escaping,以便读取你的代码的人知道闭包将在该函数的生命周期之后继续存在。