2015-12-02 2 views
0

Я пытаюсь вернуть переменную statusCode, которая должна принимать значение свойства statusCode NSHTTPURLResponse, однако я получаю нуль, даже когда я проверяю, и я вижу, что данные успешно вывешенный. Он возвращает 0, который инициализировал переменную ... как мне это сделать? Благодарю.Возвращение statusCode из NSHTTPURLResponse в переменной

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

Вы вызываете WebService асинхронно, поэтому, когда вы вернетесь StatusCode как таким образом вы не получите результат назад с сервера. –

+0

Я действительно хочу, чтобы он был асинхронным, так как я не хочу, чтобы приложение зависало. Не удается ли достичь этого с помощью этого метода? – Rasmus

+0

Да, вы можете. Пожалуйста, проверьте мой ответ –

ответ

1

Вы возвращаете statusCode до асинхронного вызова возвращает результат. Вы можете обработать этот случай, пройдя закрытие и вызывая его, когда веб-сервис возвращает результат. Для этого реализовать метод, как:

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 ... так что это действительно хорошо. Но я все еще не могу вернуть statusCode, как это, и это то, что мне нужно. Это потому, что я представляю UIAlertController в зависимости от значения в моем ViewController. Я попытался вернуть значение из postData, но не повезло. – Rasmus

+1

@Rasmus: либо сделать синхронный вызов, либо сделать его похожим на вышеупомянутый путь. Другого пути нет. Вы не можете вернуть значение сразу после вызова метода async. Теперь это ваш выбор, выбор между обоими подходами. –

+0

Хорошо, спасибо! – Rasmus

Смежные вопросы