2016-03-18 4 views
1

Я пробовал сделать вспомогательный класс для моего запроса POST и хочу вернуть ответ. Однако, поскольку пост-запрос является асинхронным, это заставило меня немного смутить.Использование функции помощника для запроса POST

Я попытался вернуть NSString, однако он не позволил мне вернуть ни response, ни responseString. Просто позвольте мне поставить return "A". Я попытался использовать -> NSURLResponse, но не смог заставить его работать.

Каков правильный способ создания вспомогательного метода? (Это также хорошо, если я сделаю чек после того как я получить ответ, и возвращает истину или ложь в зависимости от ответа)

class func hello(name: String) -> NSString { 

    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.thisismylink.com/postName.php")!) 
    request.HTTPMethod = "POST" 
    let postString = "Hi, \(name)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     guard error == nil && data != nil else {               // check for fundamental networking error 
      print("error=\(error)") 
      return 
     } 

     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 

     } 

     let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(responseString)") 
    } 
    task.resume() 
    return "A" 
} 

ответ

5

Поскольку dataTaskWithRequest является асинхронным, функция ударилась оператор возврата, прежде чем блок завершения выполняется. Что вам нужно сделать, это либо настроить блок завершения для вашего собственного вспомогательного метода, либо передать какой-то объект делегата функции, чтобы вы могли вызвать метод на нем, чтобы сообщить ему, каков был результат обратного вызова webservice.

Ниже приведен пример использования блока завершения:

class func hello(name: String, completion: (String? -> Void)){ 

    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.thisismylink.com/postName.php")!) 
    request.HTTPMethod = "POST" 
    let postString = "Hi, \(name)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     guard error == nil && data != nil else {               // check for fundamental networking error 
      print("error=\(error)") 
      return 
     } 

     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 

     } 

     let responseString = String(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(responseString)") 

     completion(responseString); 
    } 
    task.resume() 
} 

затем использовать его

<#YourClass#>.hello("name") { responseString in 

    //do something with responseString 
} 

нету протестировали код, но должно быть около правой

+0

Wow! Человек-туз !! Благодаря!!! – senty

+1

Обратите внимание на изменение строки 'let responseString = String (data: data !, encoding: NSUTF8StringEncoding)' изменил NSString на String, чтобы быть более swifty – Fonix

+1

также обратите внимание, что я не включал код обработки ошибок, вы сами по себе, как справиться с этим – Fonix

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