从 JSON 中提取值并传递给 Swift 中的另一个 ViewController

Posted

技术标签:

【中文标题】从 JSON 中提取值并传递给 Swift 中的另一个 ViewController【英文标题】:Extracting value from JSON and passing to another ViewController in Swift 【发布时间】:2018-09-05 08:35:42 【问题描述】:

我正在尝试从 JSON 中提取一个数字 (ageInDays),然后将其传递给另一个视图控制器。

如果我打印ageInDays,它会打印正确的答案,但当我尝试将它传递给另一个VC时会返回nil,但如果我将默认值传递给另一个VC,它会毫无问题地通过。 我正在使用 Alamofire 和 SwiftyJSON

我只包括了网络、解析和发送部分。

基本上,该应用程序会根据统计数据大致告诉您您还剩多少天(这通常会吓到我做更多事情。)

var ageInDays = ""

//MARK: - Networking


func getAgeData(url: String)
    Alamofire.request(url, method: .get)
        .responseJSON  response in
            if response.result.isSuccess 
                print("Yes! We have the data!")
                let AgeJSON: JSON = JSON(response.result.value!)

                self.updateAgeData(json: AgeJSON)
             else 
                print("Error: \(String(describing: response.result.error))")
                self.warningLabel.text = "Sorry, connection issues."
            
    


//MARK: - JSON Parsing

func updateAgeData(json: JSON) 

    if let ageResult = json["remaining_life_expectancy"].double
    let ageInDays = (String((ageResult) * 365))
        print(ageInDays)
     else 
        warningLabel.text = "Error: parsing JSON"
    


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let viewController = segue.destination as! ViewController
    viewController.ageFromSettings = ageInDays


@IBAction func calculateButtonPressed(_ sender: Any) 

    dateNowAsURL()
    if count > 0 
        finalURL = "\(baseUrl)\(sex)\(URLcountry)\(URLdate)\(URLage)"
        print(finalURL)

        getAgeData(url: finalURL)
    

    if ageInDays != ""
        performSegue(withIdentifier: "sendingAgeData", sender: self)
    


【问题讨论】:

问题:您错过了 Alamofire 请求是 ASYNCHRONE 的事实。将getAgeData(url: finalURL) 替换为getAgeData(url: finalURL); print("After getAgeData"); 并检查print("Yes! We have the data!") 是在之前还是之后打印的。如何管理它们:寻找“Swift + Closure + Async”。 谢谢,这真的很有帮助!我做出了改变,“是的!我们有数据!”在给出结果之前打印。再次感谢! 【参考方案1】:

您的代码似乎有两个问题。

1) 您的 API 调用是异步的,因此您在获得 API 响应之前执行 Segue。你应该要么实现一个回调函数,要么在你得到值后写下这一行。

self.updateAgeData(json: AgeJSON)
performSegue(withIdentifier: "sendingAgeData", sender: self)

2) 您的变量“ageInDays”。您永远不会为该变量分配任何值。在 updateAgeData() 函数中,您正在创建一个局部变量。您的全局变量没有获得该值。

这样使用

self.ageInDays = (String((ageResult) * 365))

【讨论】:

【参考方案2】:

我的代码有 2 个问题:

    因为 Alamofire 是异步的,所以我必须在取回数据后执行 segue。

    最大的问题实际上是确保通过 segue 发送的数据符合所需的格式。在这种情况下,作为 Int,而不是 String。

【讨论】:

以上是关于从 JSON 中提取值并传递给 Swift 中的另一个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章