Swift:从NSURLSession任务返回JSON字符串

时间:2015-01-05 22:29:23

标签: json string swift nsurlsession

我想将令牌作为字符串类型,但是下面的代码返回错误,因为“”字符串“不能转换为”Void“”。 你能告诉我这是什么问题吗? 为了解析JSON,我使用了SwiftyJSON

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()
}

※1月6日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 个答案:

答案 0 :(得分:1)

dataTaskWithRequest闭包采用void的返回类型。返回字符串的方法在执行task.resume()后立即结束,并且不返回任何内容。

您的基本问题是您正在将同步思维应用于异步任务。一个简单的建议是让authentication()返回void(即,什么都没有),然后创建一个单独的方法,如didReceiveAuthToken(token : String),当收到令牌时,由完成处理程序调用。