2015-01-05 79 views
1

我想將令牌作爲String類型獲取,但下面的代碼返回錯誤,因爲「」String「不能轉換爲」Void「」。 你能告訴我什麼問題? 爲了解析JSON,我用SwiftyJSONSwift:從NSURLSession任務中返回JSON字符串

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

※被修改Jan6th 7:50(GMP + 9小時) 我編輯如下,但是我有誤差爲 「」 使用未解決的識別符 「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 closure返回類型void。返回字符串的方法在執行task.resume()後立即結束,並且不返回任何內容。

您的基本問題是您正在將同步思維應用於異步任務。一個簡單的建議是讓authentication()返回void(即沒有),然後創建一個單獨的方法,如收到令牌時由完成處理程序調用的didReceiveAuthToken(token : String)

+0

我根據上述建議編輯了代碼,但是我無法在認證功能之外獲得標記字符串。你能告訴我該怎麼做嗎? – lalala

+0

使用該標記作爲參數,調用您創建的方法。 –

+0

會不會有一個簡單的委託模式,來調用一個方法並將數據傳回另一個類,這裏​​也是一個好的解決方案嗎? – Woodstock