我正在尝试从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函数更新,而且它总是空的..为什么会发生这种情况?以及如何解决它?!
答案 0 :(得分:3)
在将数据提取到数组后将其写入地址函数
DispatchQueue.main.async{
tableView.reloadData()
}
答案 1 :(得分:1)
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-在重新加载之前通过打印验证,因为您可能没有响应