【发布时间】: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”。 -
谢谢,这真的很有帮助!我做出了改变,“是的!我们有数据!”在给出结果之前打印。再次感谢!