2016-06-09 41 views
0

我知道這個問題已經被問數十次之前,但遺憾的是我沒有足夠的斯威夫特與見地,以這些答案適應我的問題前等待「dataTaskWithRequest」響應。斯威夫特 - 出發

基本上我有一個發送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

任務在不同的線程比它被稱爲完成,這是由設計這樣的網絡請求不要在主線程停止執行。因此,您的代碼塊將在網絡請求完成之前被調用async並且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 
} 
+0

感謝您的快速響應。有道理你在說什麼,我想我已經正確地實現了你的解決方案,但是在調用remoteRand()函數的其他函數中因爲它需要參數而出現錯誤。 「在調用錯誤中缺少參數#1的參數」。它似乎沒有接受任何我通過它。 – Rhys

+0

刪除,你叫它並再次鍵入它,Xcode中會自動完成圖案的參數,你可以使用它,如上圖所示。 –

+0

閱讀你最後的評論之後,我做了你說的話,然後我有實現的那一刻,我以爲這一切感覺良好,我有它想通了。我收到了相應的響應數據,但在我需要收到響應後,我仍然遇到同樣的問題。我想發佈我嘗試過的東西,但已經快凌晨3點了,我需要睡覺。如果有什麼辦法可以發佈你的代碼在上下文中挖掘它將不勝感激。當我得到一個機會時,我會檢查出來,看看我有多接近。歡呼你所有的耐心:) – Rhys