如何在JSON Alamofire请求中的函数中返回正确的值?

时间:2019-02-05 15:45:15

标签: ios json swift alamofire swifty-json

现在,我已经能够访问要从JSON抓取的数据。现在,我需要创建一个变量来保存数据,因为我们不想将其存储在数据库中。

我试图使变量totalBalance将该值存储为可选值,但它给了我一个错误,因为我尝试在函数中返回它,并且它返回nil并破坏了应用程序。当我将其赋值为0时,将返回零,因为该函数未按顺序运行,但会在alamofire请求的同时运行return语句,从而导致该变量永远不会被分配正确的值。我希望totalBalance从函数中返回totalBalance。打印语句显示totalBalance值在哪里死亡。

var totalBalance: Double = 0

func grabBalance() -> Double {
    var getBalance: Double = 0

    Alamofire.request("http://localhost:8000/accounts/balance/get", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
        print("Request: \(String(describing: response.request))")   // original url request
        print("Response: \(String(describing: response.response))") // http url response
        print("Result: \(response.result)")

        if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
            print("Data: \(utf8Text)") // original server data as UTF8 string
        }                      // response serialization result

        if let json = response.result.value {
            print("JSON: \(json)") // serialized json response
            let jsonValue = JSON(json)
            if let items = jsonValue["balanceResponse"]["accounts"].array {
                for item in items {
                    if let current = item["balances"]["current"].double{
                        print(current)
                        getBalance = getBalance + current
                    }
                    self.totalBalance = getBalance
                }
            }
        }
        print("This is where it shows the total balance: \(self.totalBalance)")
    }
    print("This is where it shows that it is 0: \(self.totalBalance)")
    return self.totalBalance
}

1 个答案:

答案 0 :(得分:0)

使用Alamofire进行请求时,您正在使用Asynchronous请求,这意味着请求后的代码将被执行,而不会等待请求完成。

在特定情况下,您可以在成功回调中返回totalBalance