URLSession.shared.uploadTask 完成后继续使用代码



我正在尝试使用命令"uploadTask"与 Swift 与 php-website 进行通信。该站点正在发回数据,运行良好。网站的结果存储在变量"答案"中。但是在上传任务恢复((完成后,我如何实际使用"答案"呢?

运行文件时,它始终打印:"一"然后"三"然后"二"。

我知道我可以在"打印("两个"("部分所在的位置使用"答案"来做事。在许多例子中,使用了命令"DispatchQueue.main.async { ... }"。但我明确希望完成上传任务,然后继续进行更多计算。

   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")

使用具有完成处理程序的 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
}

苹果文档

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

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

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

相关内容

  • 没有找到相关文章

最新更新