Swift - 等待"dataTaskWithRequest"响应,然后再继续



我知道这个问题以前已经被问过几十次了,但不幸的是,我对 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
}

最新更新