我知道这个问题以前已经被问过几十次了,但不幸的是,我对 Swift 的了解还不够多,无法将这些答案适应我的问题。
基本上,我有一个函数,可以将 POST 请求发送到服务器上的 php 脚本,但接收响应的时间似乎比我的脚本利用结果的时间要长。它发送一个数字变量并接收一个作为响应,所以我也将其从"any_object"转换为"NSNumber"。据我了解,我需要实现一个完成处理程序,但我似乎无法弄清楚如何让它与下面的代码一起使用。
var dataResult: Int = 0
var dataReceived: NSNumber?
func remoteRand() {
let dataToSend = 1
let myUrl = NSURL(string: "http://localhost/scripts/phpScript.php")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let postString = "dataToSend =(dataToSend)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_main_queue()) {
if (error != nil) {
self.displayAlertMessage((error?.localizedDescription)!)
return
}
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
if let parseJSON = json {
let dataReceived = parseJSON["dataValue"]
self.dataResult = (dataReceived as! NSNumber).integerValue
print("(self.dataResult) is server response")
}
} catch { print(error)}
}
}
task.resume()
processResult()
}
func processResult() {
print(dataResult)
}
我得到的结果是:
0
1 is server response
如何让它在继续下一个函数之前等待响应,或者在确认完成后触发下一个函数?
提前感谢!
与调用它的线程不同的线程上完成,这是设计使然,因此网络请求不会停止在主线程上的执行。因此,您的代码块被异步发送,并在网络请求完成之前调用processResult。可以将调用放在 do 块中,也可以向可以调用的方法添加闭包。
func remoteRand(completion: (response: Int) ->()) {
// your code
// process JSON
// get value
completion(dataReceived)
// is passed back, just like the dataTaskWithRequest method to your caller where you can set the property on self, etc.
}
在某处使用它:
remoteRand { [weak self] (response) in
self?.dataResult = response
}