【问题标题】:Swift: Updating Label / HTTP RequestSwift:更新标签/HTTP 请求
【发布时间】:2018-02-21 17:11:27
【问题描述】:

也许有人可以帮助找到我的问题的答案: 我正在向后端发送一个发布请求,该后端是使用 Java 和 Playframework2 创建的。 在我的 xcode 应用程序中,我可以创建一个用户,无论用户是否在数据库中,后端都会回复一个状态码,我想将其显示在标签上。 问题是状态码的文本/状态总是“落后”。

所以我启动了我的后端和我的 xcode 应用程序。 当我单击提交按钮时,该按钮会向后端触发带有 json 数据的 http 请求,并创建用户并且状态码为 200 个回复,但未显示在标签上。 当我再次单击提交按钮(试图创建同一个人)时,会响应 409。 但是现在标签显示了之前发送的 200 个请求。

有人知道吗?

class ViewController: UIViewController {

@IBOutlet var tfEmail: UITextField!

@IBOutlet var tfUsername: UITextField!

@IBOutlet var tfPW: UITextField!

var ret: String = "app loaded";
@IBOutlet var label: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    print("Hello world");




}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func printMessage() -> Void {
    let json = ["email" : self.tfEmail.text!,
                "username" : self.tfUsername.text!,
                "password" : self.tfPW.text!] as [String : Any];

    do {

        let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted);

        let url = URL(string: "http://localhost:9000/save")!
        var request = URLRequest(url: url);

        request.httpMethod = "POST";
        request.setValue("application/json; charset=utf8", forHTTPHeaderField: "Content-Type");
        request.httpBody = jsonData;

        let task = URLSession.shared.dataTask(with: request) {
            data, response, error in
            if error != nil {
                print("Error -> \(String(describing: error))");
                self.ret = "\(String(describing: error))";
            }
            if let httpResponse = response as? HTTPURLResponse {
                print("statusCode: \(httpResponse.statusCode)");
                if(httpResponse.statusCode == 200) {
                    self.ret = "success \(httpResponse.statusCode)"
                } else {
                    self.ret = "error \(httpResponse.statusCode)"
                }
            }
        }

        task.resume();
    } catch {
        print(error);
    }

}

@IBAction func postButton(_ sender: Any) {

    printMessage()
    label.text = self.ret;


}

}

【问题讨论】:

  • 因为调用是异步的,这就是原因。
  • 当您获得响应代码时,您需要将 label.text = self.ret 移动到您的 http 任务内的 dispatchQueue.main.async{} 中。

标签: swift xcode post httprequest


【解决方案1】:

主要问题是您在按下按钮时设置标签文本,而不是在获得所需值之后。更改您的代码:

if let httpResponse = response as? HTTPURLResponse {
                print("statusCode: \(httpResponse.statusCode)");
                if(httpResponse.statusCode == 200) {
                    self.ret = "success \(httpResponse.statusCode)"
                    doLabelChange()
                } else {
                    self.ret = "error \(httpResponse.statusCode)"
                    doLabelChange()
                }




func doLabelChange() {
    DispatchQueue.main.async {
           self.label.text = self.ret
        }
}

【讨论】:

  • 乐于助人!!
猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多