[英]Updating a global variable from JSON response inside function
我正在尝试从JSON响应中获取一些变量,并将其显示在自定义表格视图中。问题是变量从未更新过。更多的解释是我的代码:
func getAddresses(){
let todosEndpoint: String = "my link"
guard let todosURL = URL(string: todosEndpoint) else {
print("Error: cannot create URL")
return
}
var todosUrlRequest = URLRequest(url: todosURL)
todosUrlRequest.httpMethod = "POST"
todosUrlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
let newTodo: [String: Any] = ["email": UserDefaults.standard.string(forKey: "email"), "password": UserDefaults.standard.string(forKey: "password")]
print(newTodo)
let jsonTodo: Data
do {
jsonTodo = try JSONSerialization.data(withJSONObject: newTodo, options: [])
todosUrlRequest.httpBody = jsonTodo
} catch {
print("Error: cannot create JSON from todo")
return
}
let session = URLSession.shared
let task = session.dataTask(with: todosUrlRequest) {
(data, response, error) in
guard error == nil else {
print("error calling POST on /public/api/login_customer")
print(error!)
return
}
guard let responseData = data else {
print("Error: did not receive data")
return
}
// parse the result as JSON, since that's what the API provides
do {
guard let receivedTodo = try JSONSerialization.jsonObject(with: responseData,options: []) as? [String: Any] else {
print("Could not get JSON from responseData as dictionary")
return
}
print("The todo is: " + receivedTodo.description)
guard let status = receivedTodo["success"] as? Int else {
print("Could not get status from JSON")
return
}
if status == 0{
print("The status is: 0")
guard let messages = receivedTodo["message"] as? [String:[String]] else {
print("Could not get messages from JSON")
return
}
for (key, value) in messages {
var msgs = [String]()
msgs.append(value.joined(separator:", "))
print("The \(key) error is: " + value.joined(separator:", "))
}
}
else {
if let address = receivedTodo["address"] as? [[String:Any]] {
for info in address {
self.label.append(info["label"] as! String)
//self.street.append(info["description"] as! String)
//self.building.append(info["building_number"] as! String)
}
}
print("Success!")
}
} catch {
print("error parsing response from POST on /public/api/login_customer")
return
}
}
task.resume()
}
这是我在viewDidLoad()中调用以更新这些数组的函数:
var label = [String]()
var street = [String]()
var building = [String]()
我在表视图中使用的是这样的:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableview.dequeueReusableCell(withIdentifier: "CustomCell") as! CustomTableViewCell
cell.label.text=label[indexPath.row]
cell.street.text=street[indexPath.row]
cell.buildingno.text=building[indexPath.row]
return cell
}
我的viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
getAddresses()
tableview.delegate=self
tableview.dataSource=self
tableview.tableFooterView = UIView()
self.tableview.backgroundColor = UIColor(red:0.96, green:0.96, blue:0.96, alpha:1.0)
// Do any additional setup after loading the view.
}
问题是这些全局变量从不从getAddresses函数进行更新,并且始终为空..为什么会发生这种情况? 以及如何解决?
在将数据提取到数组中后,将其写入地址函数中
DispatchQueue.main.async{
tableView.reloadData()
}
1-重新加载表格
if let address = receivedTodo["address"] as? [[String:Any]] {
for info in address {
self.label.append(info["label"] as! String)
//self.street.append(info["description"] as! String)
//self.building.append(info["building_number"] as! String)
}
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
2-在重新加载之前通过打印验证,因为您可能没有响应
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.