Как получить доступ к переменной, назначенной внутри API? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь запустить функцию API, изменить переменные и затем показать эти результаты в представлении.

Я посмотрел другие решения по переполнению стека, но не понял ни одного из них.

Поэтому я написал некоторый фиктивный код, чтобы показать, что я имею в виду.Это выглядит просто, но это было очень сложно и сложно.

import UIKit
import Alamofire
import SwiftyJSON

class HomeViewController: UIViewController {

    @IBOutlet weak var weather: UILabel!

    var temperature = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        getWeatherData()

        weather.text = temperature // This still returns an empty string

    }

    func getWeatherData() {
        Alamofire.request("http://api.openweathermap.org/data/2.5/weather", method: .get).responseJSON {
            response in
            if response.result.isSuccess {

                print("Success! Got the weather data")

                let weatherJSON : JSON = JSON(response.result.value!)
                temperature = String(weatherJSON["main"]["temp"].double)

            } else {
                print("Error \(String(response.result.error))")
            }
        }
    }  
}

Как мне сделать новое значение для temperature доступным глобально?

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Измените свою температурную переменную, чтобы она выглядела следующим образом.Как отметил @Don в своем комментарии, ваш веб-запрос выполняется асинхронно и возвращается после вызова viewDidLoad.

var temperature = "" {
    didSet {
        weather.text = temperature
    }
}
2 голосов
/ 23 марта 2019

Как уже упоминалось @Don getWeatherData() - асинхронная функция, и результат вызова API будет доступен после завершения вызова функции. Вы можете решить это как:

var temperature = "" {
    didSet { weather.text = temperature }
}

override func viewDidLoad() {
    super.viewDidLoad()
    getWeatherData()
}

...
self.temperature = String(weatherJSON["main"]["temp"].double)
...

...