2015-01-05 3 views
1

Я хочу получить токен как тип String, однако следующий код возвращает ошибку, поскольку «String» не конвертируется в «Void». Не могли бы вы рассказать мне, в чем проблема? Для того, чтобы разобрать JSON, я использовал SwiftyJSONSwift: возвращает строку JSON из задачи NSURLSession

func authentication() -> String { 
    let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!) 
    request.HTTPMethod = "POST" 

    var loginID = "my_ID" 
    var apiKey = "my_APIKEY" 
    var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)" 

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      println("error=\(error)") 
      return 
     } 

     println("response = \(response)") 

     let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("responseString = \(responseString)") 


     let json = JSON(data:data) 
     if let token = json["auth_token"].stringValue{ 
      println("\(token)") 

      return token ///Error Here 
     } 
    } 
    task.resume() 
} 

※ Edited Jan6th 7:50 (GMP + 9hr) я редактировал следующим образом, но я получил сообщение об ошибке, как "" Использование неразрешенного идентификатора "tokenString". Скажите, пожалуйста, как решить проблему.

func authentication() -> String { 
    let request = NSMutableURLRequest(URL: NSURL(string: "https://~~~/v2/authenticate/api")!) 
    request.HTTPMethod = "POST" 

    var loginID = "my_ID" 
    var apiKey = "my_APIKEY" 
    var postString:NSString = "login_id=\(loginID)&api_key=\(apiKey)" 

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      println("error=\(error)") 
      return 
     } 

     println("response = \(response)") 

     let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("responseString = \(responseString)") 


     let json = JSON(data:data) 
     if let token = json["auth_token"].stringValue{ 
      println("\(token)") 

      tokenString = self.didReceiveAuthToken(token)///Edited 
     } 
    } 
    task.resume() 
    return tokenString 
} 
func didReceiveAuthToken(token : String) ->String{ 
    return token 
} 

ответ

1

dataTaskWithRequest замыкание принимает тип возвращаемого void. Ваш метод, который возвращает строку, заканчивается сразу после выполнения task.resume() и ничего не возвращает.

Основная проблема заключается в том, что вы применяете синхронное мышление к асинхронной задаче. Одно простое предложение состоит в том, чтобы получить authentication() return void (т. Е. Ничего), а затем сделать отдельный метод, например didReceiveAuthToken(token : String), который вызывается обработчиком завершения при получении маркера.

+0

Я отредактировал код на основе вашего совета, как указано выше, однако я не могу получить токенную строку вне функции аутентификации. Не могли бы вы рассказать мне, как это сделать? – lalala

+0

Вызовите метод, который вы создали, используя токен в качестве аргумента. –

+0

не будет простым шаблоном делегирования, чтобы вызвать метод и передать данные другому классу, чтобы быть хорошим решением здесь также? – Woodstock

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