从JSON响应内部功能更新全局变量



我正在尝试从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-在重新加载之前通过打印验证,因为您可能有一个零响应

最新更新