如何访问在API中分配的变量?

时间:2019-03-23 02:41:48

标签: ios swift xcode alamofire

我试图运行API函数,更改变量,然后在视图中显示这些结果。

我查看了Stack Overflow上的其他解决方案,但不了解其中任何一个。

因此,我写了一些虚拟代码只是为了说明我的意思。它看起来简单,但是却非常令人沮丧和复杂。

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 个答案:

答案 0 :(得分:2)

@Don所说的getWeatherData()是异步函数,函数调用完成后,API调用的结果将可用。您可以将其解决为:

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

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

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

答案 1 :(得分:2)

将温度变量更改为如下所示。正如@Don在其评论中提到的那样,您的Web请求正在异步运行,并在调用viewDidLoad之后返回。

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