2016-11-13 6 views
-1

Dies ist die Funktion, die ich nach dem Herunterladen aller Details ausführen möchte und eine weitere Funktion, die UIElements nach dem Herunterladen aktualisieren soll. Diese Funktion ist im Inneren "CurrentWeather.swift"Funktion ausführen, nachdem die Funktion nicht funktioniert swift 3

func downloadWeatherDetails(completed: (() ->())){ 
    // tell Alimofire where to download 
    let currentWeatherURL = URL(string: CURRENT_WEATHER_URL)! 
    Alamofire.request(currentWeatherURL).responseJSON{ response in 

     let result = response.result 
     if let dict = result.value as? Dictionary<String, AnyObject>{ 

      if let name = dict["name"] as? String{ 
       self._cityName = name.capitalized 
       print(self._cityName) 
      } 

      if let weather = dict["weather"] as? [Dictionary<String, AnyObject>]{ 
       if let main = weather[0]["main"] as? String{ 
        self._weatherType = main.capitalized 
        print(self._weatherType) 
       } 
      } 

      if let main = dict["main"] as? Dictionary<String, AnyObject>{ 
       if let currentTemperature = main["temp"] as? Double { 
        let kelvinToFarenhitePreDevision = (currentTemperature * (9/5) - 459.67) 
        let kelvinToFarenhite = Double(round(10 * kelvinToFarenhitePreDevision/10)) 
        self._currentTemp = kelvinToFarenhite 
        print(self._currentTemp) 
       } 
      } 


     } 


    } 
    completed() 
} 

}

und diese Funktion ist UIEmelents

func updateMainUI(){ 

    dateLabel.text = currentWeather.date 
    currentTempLabel.text = "\(currentWeather.currentTemp)" 
    currentWeatherTypeLabel.text = currentWeather.weatherType 
    locationLabel.text = currentWeather.cityName 
    currentWeatherImage.image = UIImage(named: currentWeather.weatherType) 
} 

zu aktualisieren und dies ist ihnen func viewDidLoad auf Aufschalten() aufzurufen

jetzt, wenn ich dies ausführe seine nicht update UI Daten b ut seine sie innerhalb Konsole Druck

kann mir jemand helfen mit diesem Problem

Antwort

2

Sie rufen completed() bevor Ihre Anfrage abgeschlossen ist.

 completed() //<- you need to call the completion handler inside the closure. 
    } 
    //completed() //<- this would be called before completion 
} 

Ich habe andere Teile Ihres Codes nicht überprüft, aber zumindest müssen Sie das beheben.

+0

Thnks bro Es funktionierte –

0

Ihre WeatherDetails werden asynchron heruntergeladen. Innerhalb von viewDidLoad() wird self.updateMainUI() aufgerufen, bevor Ihre Antwort empfangen und analysiert wird. Also einfach den UIUpdateMainUI() -Methode innerhalb und am Ende dieses Blockes:

if let dict = result.value as? Dictionary<String, AnyObject>{ 
} 

Wenn Sie von einer anderen Klasse anfordern möchte, dann gibt es ein Protokoll entwerfen. Passen Sie es in dem ViewController an, den Sie aktualisieren möchten. Aus dem obigen if-let-Block rufen Sie am Ende des Parsens die Delegate-Methode von viewController auf, um aktualisiert zu werden. Und natürlich aktualisieren Sie Ihre Benutzeroberfläche in der Delegate-Methode. Danke.

Verwandte Themen