为什么全局变量没有在swift 3中更新值?

时间:2017-05-06 03:57:35

标签: ios swift global-variables

这是值为

的类
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中的变量是如何起作用的。

1 个答案:

答案 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,以便读取你的代码的人知道闭包将在该函数的生命周期之后继续存在。