从函数内部的JSON响应更新全局变量

时间:2018-04-23 12:30:35

标签: ios json swift xcode tableview

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

2 个答案:

答案 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-在重新加载之前通过打印验证,因为您可能没有响应