2015-12-02 104 views
0

我試着返回變量statusCode,它應該採用NSHTTPURLResponse的statusCode屬性的值,但是我得到零,即使當我檢查並且我看到數據成功發佈。它返回了我已經初始化變量的0 ...我怎麼去做這件事?謝謝。從一個變量返回NSHTTPURLResponse的statusCode

var statusCode = 0 

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
dispatch_async(queue) { 
     let request = NSMutableURLRequest(URL: NSURL(string: escapedUrl!)!) 
     request.HTTPMethod = "POST" 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

      if error != nil { 
       statusCode = 0 
      } else if let httpResponse = response as? NSHTTPURLResponse { 
       if httpResponse.statusCode == 200 { 
        statusCode = httpResponse.statusCode 
       } else { 
        statusCode = 0 
       } 
      } 
     } 
     task.resume() 
    } 
    return statusCode 

} 
+2

要異步調用web服務,所以當你返回的StatusCode像這樣你不會得到結果從服務器返回。 –

+0

我真的希望它是異步的,因爲我不希望應用程序凍結。用這種方法是不可能實現的? – Rasmus

+0

是的,你可以。請檢查我的答案 –

回答

1

在異步調用返回結果之前,您正在返回statusCode。您可以通過傳遞閉包並在Web服務返回結果時調用它來處理這種情況。爲了實現像方法:

func postData(escapedUrl : String?, onCompletion:(Int)->Void) 
{ 
    let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(queue) 
    { 
     let request = NSMutableURLRequest(URL: NSURL(string: escapedUrl!)!) 
     request.HTTPMethod = "POST" 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
     { 
      data, response, error in 

      var statusCode = 0 

      if error != nil 
      { 
       statusCode = 0 
      } 
      else if let httpResponse = response as? NSHTTPURLResponse 
      { 
       if httpResponse.statusCode == 200 
       { 
        statusCode = httpResponse.statusCode 
       } 
       else 
       { 
        statusCode = 0 
       } 
      } 
      // Passing back the result 
      onCompletion(statusCode); 
     } 
     task.resume() 
    } 
} 

你可以調用像方法:

postData("yourURLString") { (statusCode) -> Void in 
    // Check status code here 
} 
+0

當我檢查結果是200 ...所以這真的很好。但是我仍然不能像這樣返回狀態碼,這正是我需要的。這是因爲我提出了一個UIAlertController取決於我的ViewController中的值。我試過從postData中返回值,但沒有運氣。 – Rasmus

+1

@Rasmus:要麼使呼叫同步,要麼就像上面提到的那樣。沒有其他辦法。調用異步方法後,您無法立即返回值。現在,您可以選擇這兩種方法進行選擇。 –

+0

好的,謝謝! – Rasmus