URLSession.shared.uploadTask完成后,继续执行代码

时间:2019-07-18 00:34:54

标签: swift nsurlsessionuploadtask

我正在尝试使用命令“ uploadTask”与Swift交流到php网站。该站点正在发回数据,效果很好。网站的结果存储在变量“答案”中。但是,在完成uploadTask.resume()之后,我如何才能真正使用“答案”?

运行文件时,它总是打印: “一个”然后“三个”然后“两个”。

我知道我可以在“ print(“ two”)”部分所在的位置使用“ answer”来完成操作。在许多示例中,都使用命令“ DispatchQueue.main.async {...}”。但我明确希望完成uploadTask,然后继续进行更多计算。

   func contactPHP() {

    print("One")

    let url = "http://....php" // website to contact
    let dataString = "password=12345" // starting POST
    let urlNS = NSURL(string: url)
    var request = URLRequest(url: urlNS! as URL)
    request.httpMethod = "POST"
    let dataD = dataString.data(using: .utf8) // convert to utf8 string

    URLSession.shared.uploadTask(with: request, from: dataD)
    {
        (data, response, error) in
        if error != nil {
            print(error.debugDescription)
        } else {
            let answer = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!
            print("Two")
        }
        }.resume()  // Starting the dataTask

  print("Three")

 // Do anything here with "answer"

}

extension NSMutableData {
    func appendString(string: String) {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        append(data!)
    }
}

我已经用完成处理程序尝试过了。但这也不起作用。这也给了我“一个”,“四个”,“两个”,“三个”

func test(request: URLRequest, dataD: Data?, completion: @escaping (NSString) -> ()) {
    URLSession.shared.uploadTask(with: request, from: dataD)
    {
        (data, response, error) in
        if error != nil {
            print(error.debugDescription)
        } else {
            let answer = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!
            print("Two")
            completion(answer)
        }
        }.resume()  // Starting the dataTask
    }

let blubb = test(request: request, dataD: dataD) { (data) in
    print("Three")
}

print("Four")

1 个答案:

答案 0 :(得分:0)

使用具有完成处理程序的URLSession函数:

URLSession.shared.uploadTask(with: URLRequest, from: Data?, completionHandler: (Data?, URLResponse?, Error?) -> Void)

将您的uploadTask函数替换为以下内容:

URLSession.shared.uploadTask(with: request, from: dataD) { (data, response, error) in

     if let error = error {
          // Error
     }

     // Do something after the upload task is complete

}
  

Apple文档

     

创建任务后,必须通过调用它的resume()来启动它   方法。如果请求成功完成,则数据参数为   完成处理程序块包含资源数据和错误   参数为nil。

     

如果请求失败,则data参数为nil,并且   错误参数包含有关失败的信息。如果一个   无论是否收到来自服务器的响应   请求成功完成或失败,响应参数   包含该信息。

上载任务完成后,将调用函数的完成处理程序。您还可以实现委托人的optional func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)函数。