加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – Swift 3 – 发送make同步http请求

发布时间:2020-12-15 01:43:58 所属栏目:百科 来源:网络整理
导读:我有以下代码: func completeLoadAction(urlString:String) - Int { let url = URL(string:urlString.trimmingCharacters(in: .whitespaces)) let request = URLRequest(url: url!) let task = URLSession.shared.dataTask(with: request) { data,response,
我有以下代码:

func completeLoadAction(urlString:String) -> Int {
    let url = URL(string:urlString.trimmingCharacters(in: .whitespaces))
    let request = URLRequest(url: url!)
    let task = URLSession.shared.dataTask(with: request) { data,response,error in
        guard let data = data,error == nil else {                                                 // check for fundamental networking error
            print("error=(error)")
            let ac = UIAlertController(title: "Unable to complete",message: "The load has been added to the completion queue. This will be processed once there is a connection.",preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK",style: .default))
            self.present(ac,animated:  true)
            return
        }

    let httpStatus = response as? HTTPURLResponse
        var httpStatusCode:Int = (httpStatus?.statusCode)!

        let responseString = String(data: data,encoding: .utf8)
        print("responseString = (responseString)")
        let ac = UIAlertController(title: "Completed Successfully",message: "The "+coldel+" has been completed successfully",preferredStyle: .alert)
        ac.addAction(UIAlertAction(title:"Continue",style: .default,handler:  { action in self.performSegue(withIdentifier: "segueConfirmedLoad",sender: self) }))

        self.present(ac,animated: true)

    }
    task.resume()
    return httpStatusCode
}

我需要能够调用它并同时检查返回值,因为它是http状态代码,它会让我知道调用是否成功.

问题是因为它在dataTask中我无法访问响应状态代码

var httpStatusCode:Int = (httpStatus?.statusCode)!

因为任务在调用Task.Resume()之前不会启动,并且任务是异步的,所以它永远不会工作.

这有什么办法吗?

解决方法

总有一种方法可以使用异步模式.

要使函数异步,请添加完成块

func completeLoadAction(urlString:String,completion: (Int) -> ()) {
   let url = URL(string:urlString.trimmingCharacters(in: .whitespaces))
   let request = URLRequest(url: url!)
   let task = URLSession.shared.dataTask(with: request) { data,error in
      guard let data = data,error == nil else {                                                 // check for fundamental networking error
         print("error=(error)")
         DispatchQueue.main.async {
            let ac = UIAlertController(title: "Unable to complete",animated:  true)
         }
         completion(0) // or return an error code 
         return     
      }

      let httpStatus = response as? HTTPURLResponse
      var httpStatusCode:Int = (httpStatus?.statusCode)!

      let responseString = String(data: data,encoding: .utf8)
      print("responseString = (responseString)")
      DispatchQueue.main.async {
         let ac = UIAlertController(title: "Completed Successfully",preferredStyle: .alert)
         ac.addAction(UIAlertAction(title:"Continue",sender: self) }))
         self.present(ac,animated: true)
      }
      completion(httpStatusCode)
   }
   task.resume()

}

并称之为

completeLoadAction(urlString: "www.something.com") { code in
   print(code)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读