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