【问题标题】:Updating a global variable from JSON response inside function从函数内部的 JSON 响应更新全局变量
【发布时间】:2018-10-03 12:03:47
【问题描述】:

我正在尝试从 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 函数更新并且它总是空的..为什么会发生这种情况?以及如何解决?!

【问题讨论】:

  • 显示您的 viewDidLoad。发生这种情况是因为 JSON 正在另一个线程中加载
  • @MoazKhan 刚刚发布了它

标签: ios json swift xcode tableview


【解决方案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- 在重新加载之前通过打印进行验证,因为您可能会收到 nil 响应

【讨论】:

    【解决方案2】:

    将数据提取到数组后,将其写入地址函数

    DispatchQueue.main.async{
        tableView.reloadData()
       }
    

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 1970-01-01
      • 2020-04-22
      • 2020-09-09
      • 2022-08-02
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多