php - Swift - 在继续之前等待 "dataTaskWithRequest"响应

标签 php json xcode swift

我知道这个问题之前已经被问过几十次了,但不幸的是我对 Swift 的了解不够,无法根据我的问题调整这些答案。

基本上,我有一个函数可以向服务器上的 php 脚本发送 POST 请求,但接收响应的时间似乎比我的脚本利用结果的时间要长。它发送一个数字变量并接收一个作为响应,因此我还将其从“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 block 中,或者为可以调用的方法添加闭包。

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
}

关于php - Swift - 在继续之前等待 "dataTaskWithRequest"响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725674/

相关文章:

ios - 了解堆栈跟踪

ios - 由于未捕获的异常而终止应用程序 Swift

php - 如何检查 PHP 是否启用了 gzip 压缩?

php - fatal error : Class 'SolrClient' not found

c# - 如何使用 C# 使用 HttpClient 发布 JSON?

javascript - 如何使用 javascript 从 json 中检索字符串值?

java - 尝试使用 SPARK 1.6 (WrappedArray) 从嵌套 JSON 中收集值

javascript - 在单独的页面中打印 Javascript?

php - IE 的条件标签 - 如果浏览器是 IE,是否可以不加载 JS 文件?

iphone - 如何从已编译的 iOS 应用程序中解压缩/提取 *.nib 文件