Swift - 在继续

时间:2016-06-09 12:12:18

标签: php json xcode swift

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

如何在继续执行下一个功能之前让它等待响应,或者在确认完成后触发下一个功能?

提前致谢!

1 个答案:

答案 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
        })
  }