异步 HTTPS POST 请求

时间:2020-12-22 13:51:40

标签: swift

在我使用 WebView 转入视图控制器以在 resultFormHtml 变量中显示 HTML 之前,我试图将我的 https 发布响应放入一个名为 resultFormHtml 的变量中。

使用下面的代码,我在 perfomSegue 上得到一个错误“UIViewController.init(coder:) 只能从主线程使用”

如何让我的 resultFormHtml 变量不为空并转到下一个 VC?

dpoHttpPost(dpoHttp: dpoHttp) { [self] (result) in
  if result == true {
    self.performSegue(withIdentifier:"rechargeDpoSegue", sender: self)
  }else{
    //do something here
  }
}

func dpoHttpPost(dpoHttp: Bool,completion:  @escaping (Bool)->()){
  let url = URL(string: self.dpoURL)!
  var request = URLRequest(url: url)
  request.httpMethod = "POST"
  request.httpBody = self.postFormHtml.data(using: .utf8)
        
  // Create the HTTP request
  let session = URLSession.shared
  let task = session.dataTask(with: request) { (data, response, error) in

    if let error = error {
      // Handle HTTP request error
      self.resultFormHtml = "<HTML><BODY>Error</HTML></BODY>"
      completion(false)
    } else if let data = data {
      // Handle HTTP request response
      self.resultFormHtml = String(data: data, encoding: .utf8)!
      print(String(data: data, encoding: .utf8)!)
      completion(true)
    } else {
      // Handle unexpected error
      self.resultFormHtml = "<HTML><BODY>Error</HTML></BODY>"
       completion(false)
    }
  }
  task.resume()
}

1 个答案:

答案 0 :(得分:0)

使用 DispatchQueue:

if let error = error {
        // Handle HTTP request error
        self.resultFormHtml = "<HTML><BODY>Error</HTML></BODY>"
        completion(false)
    } else if let data = data {
        
        DispatchQueue.main.async{ [self] in
            
            // Handle HTTP request response
            self.resultFormHtml = String(data: data, encoding: .utf8)!
            
            print(String(data: data, encoding: .utf8)!)
            
            completion(true)
            
        }
        
    } else {
        // Handle unexpected error
        self.resultFormHtml = "<HTML><BODY>Error</HTML></BODY>"
        completion(false)
    }
相关问题