gpt4 book ai didi

swift - 如何使用转义闭包和异步调用加载 UI?

转载 作者:行者123 更新时间:2023-11-30 12:27:35 26 4
gpt4 key购买 nike

我编写了一个名为“configureLabels()”的函数,该函数应该发出“GET”请求并检索一个值,然后将该值设置为标签的文本。该请求是异步的,所以我认为我可以在请求完成时使用转义闭包来更新 UI。我对编码比较陌生,所以我不确定我做错了什么。我非常感谢任何人帮助解决这个问题。

这是包含“configureLabels()”方法的代码:

import UIKit

导入 SwiftyJSON

类 ItemDetailViewController: UIViewController {

@IBOutlet weak var numberOfFiberGrams: UILabel!

var ndbnoResults = [JSON]()
var ndbno = ""

let requestManager = RequestManager()

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
configureLabels()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}


func configureLabels() {

requestManager.ndbnoRequest(ndbno: ndbno) { (results) in
let json = JSON(results)
let fiber = json["food"]["nutrients"][7].dictionaryValue
for (key, value) in fiber {
if key == "value" {
self.numberOfFiberGrams.text = "\(value.stringValue)"
} else {
self.numberOfFiberGrams.text = "Fail"
}
}
}
}

/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/

}

这里是包含“configureLabels()”调用的函数的代码:

    func ndbnoRequest(ndbno: String, apiKey: String, completionHandler: @escaping (_ results: JSON?) -> Void) {
Alamofire.request("https://api.nal.usda.gov/ndb/V2/reports?ndbno=\(ndbno)&type=f&format=json&api_key=\(apiKey)", method: .get).validate().responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
completionHandler(json)
print("successful ndbno request")
case .failure(let error):
completionHandler(nil)
print(error)
}
}
}

最佳答案

你的代码看起来不错,我发现你的代码的唯一问题是你没有在failure部分调用completionHandler,你需要始终调用完成 block ,这样它就会让您知道您是否收到响应,因为您的 completionHandler 参数是 [JSON] 类型,因为您在 failure 部分没有响应您没有在其中调用 completionHandler 。您可以做的就是使其成为可选,并在失败的情况下使用nil参数调用completionHandler

func ndbnoRequest(ndbno: String, completionHandler: @escaping (_ results: [JSON]?) -> Void) {
let parameters = ["api_key": "tIgopGnvNSP7YJOQ17lGVwazeYI1TVhXNBA2Et9W", "format": "json", "ndbno": "\(ndbno)"]
Alamofire.request("https://api.nal.usda.gov/ndb/reports/V2", method: .get, parameters: parameters).responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
let ndbnoResults = json["foods"].arrayValue
completionHandler(ndbnoResults)
print("successful ndbno request")
case .failure(let error):
completionHandler(nil)
print("error with ndbno request")
}
}
}

现在以这种方式调用它,并将可选内容包装在完成 block 中,以便您可以确认收到响应。

requestManager.ndbnoRequest(ndbno: ndbno) { (results) in
if let result = results {
let json = JSON(result)
let fiber = json["food"]["nutrients"][7].dictionaryValue
for (key, value) in fiber {
if key == "value" {
self.numberOfFiberGrams.text = "\(value.stringValue)"
} else {
self.numberOfFiberGrams.text = "Fail"
}
}
}
else {
print("Problem to get response")
}
}

关于swift - 如何使用转义闭包和异步调用加载 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43984805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com