我正在尝试使用命令"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)
函数。