我知道这个问题之前已被问过几十次但不幸的是我对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
如何在继续执行下一个功能之前让它等待响应,或者在确认完成后触发下一个功能?
提前致谢!
答案 0 :(得分:0)
任务在与调用它不同的线程上完成,这是设计使得网络请求不会停止在主线程上执行。因此,您的代码块将在网络请求完成之前发送异步并调用processResult。您可以将调用放在do块中,或者为可以调用的方法添加闭包。
if(selectJob.getType() == 'G'){
long tardy = Long.parseLong(offSetValue);
Timestamp gleichzeitig = new Timestamp(dateBegin.getTime()+ tardy);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String simulDate = simpleDateFormat.format(gleichzeitig);
atnajsonJobLine.add(simulDate);
}
在某处使用它:
function getGPlusContacts(id, collectionName) {
var deferred=$q.defer
return $http.get("https://www.googleapis.com/plus/v1/people/" + id + "/people/" + collectionName)
.then( function(contacts) {
deferred.resolve(contacts)
return deferred.promise
})
}