2017-05-06 80 views
-1

這是其中值是爲什麼全局變量不在swift 3中更新值?

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內打印值。我很困惑,因爲這個,swift 3中的變量是如何工作的。

+0

您在關閉之外調用'completed',因此在下載完成之前調用它。 – Paulw11

+0

它應該在哪裏?它在'weatherDataDownload'的'func'裏面' – Digs

+0

它應該是'responseJSON'封閉內的最後一行 – Paulw11

回答

1

請參閱以下代碼示例中的註釋。您需要將調用「完成()」

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,它執行它的在後臺線程請求。當該請求完成時,它會調用您定義的閉包(即啓動「在...中響應」的閉包)。在完成此操作之前,您不想調用updateUIweather,以便在同一個完成處理程序中將調用「completed()」。

當呼叫completed在該完成處理程序之外時,它將立即被調用......在Alamofire請求被髮送之後(但在該後臺線程完成之前)立即被調用。完成處理程序中的代碼都沒有運行,因此您的變量尚未更新。

最後,因爲你的completed閉包被傳遞給一個被髮送到後臺線程的塊,那個閉包「轉義」了當前的函數。您添加@escaping,以便讀取您的代碼的人將知道封閉將超出該函數的生命期。

+0

在主要問題中添加@escaping每個評論 –

+0

它的工作,是否有任何解釋? – Digs

+0

我加了一些解釋。 –