Извлечение значения из JSON и передача в другой ViewController в Swift - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь извлечь число (ageInDays) из JSON, а затем передать его другому View Controller.

Если я печатаю ageInDays, он печатает правильный ответ, но возвращает ноль, когда я пытаюсь передать его в другой VC, но если я передаю значение по умолчанию в другой 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)
    }

}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Было 2 проблемы с моим кодом:

  1. Поскольку Alamofire является асинхронным, я должен был выполнить переход после того, как данные были возвращены.

  2. Самой большой проблемой было убедиться, что данные, отправленные с помощью segue, были в необходимой форме. В этом случае как Int, а не String.

0 голосов
/ 05 сентября 2018

Кажется, с вашим кодом две проблемы.

1) Ваш вызов API является асинхронным, поэтому вы выполняете Segue до того, как получите ответ API. Вы должны либо реализовать функцию обратного вызова, либо написать эту строку после получения значения.

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

2) Ваша переменная "ageInDays". Вы никогда не присваиваете значение этой переменной. В функции updateAgeData () вы создаете локальную переменную. Ваша глобальная переменная не получает это значение.

Используйте это так

self.ageInDays = (String((ageResult) * 365))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...