Pourquoi dois-je obtenir un Code d'erreur=3840 Parsing JSON?

Je suis nouveau sur Swift et de développement iOS en général. Je suis en essais et d'apprendre à les utiliser à distance le serveur de l'api. Je suis JSON à partir d'un Strongloop (Loopback) de l'api lors de la tentative d'authentification et de l'analyse, je suis en train d'utiliser obtient une erreur:

Erreur de Domaine=NSCocoaErrorDomain Code=3840 "L'opération ne pouvait pas être complété. (Cacao erreur 3840.)" (Pas de valeur.) UserInfo=0x7fd623e38870 {NSDebugDescription=Pas de valeur.}

Ici est la valeur de retour dans une chaîne, je suis évidemment obtention d'une bonne réponse JSON à partir de Bouclage, un jeton d'authentification, ttl, la date et l'userId:

{"id":"BHzKnjrbUPn9KSC1GegQTNHJFNwfuifNxpfzukkyxc5iwrdehuerurvsdbmzzrvi","ttl":1209600,"created":"2015-07-03T13:04:39.791 Z","userId":2}

Je pense que le réel problème n'est PAS survenu dans le parseJSON méthode, mais plutôt la performLoginRequestWithURL méthode. Elle retourne une chaîne vide. Quelque chose à voir avec la requête asynchrone. J'ai remarqué que la chaîne json variable n'obtenir qu'après il est retourné à partir de la méthode, donc il s'est retourné vide. Si j'ai mis deux println(json) les méthodes, l'une à l'intérieur de la requête asynchrone et un après elle, l'un après l'imprime en premier. Ce qui est logique dans un sens, mais je ne sais pas comment résoudre ce problème. J'ai besoin d'obtenir le json retourné à partir de la poste, mais je ne sais pas comment faire pour capturer. Quelque chose me dit j'ai besoin d'utiliser un synchrone demande à la place, mais je ne sais pas comment faire, dans ce contexte de prise en json à partir d'une requête POST.

Voici mon code:

//Login button pressed
@IBAction func login() {
//Gets url string
    let url = getLogin()
//Posts url with UITextField data.
    if let jsonString = performLoginRequestWithURL(url) {
//Error occurs in the parseJSON method
        if let dictionary = parseJSON(jsonString) {
/*
if let at = dictionary["id"] as? String {
accesstoken = at
}
if let id = dictionary["userId"] as? Int {
println(id)
}
*/
}
}
}
func getLogin() -> NSURL {
let toEscape = "http://localhost:3000/api/Users/login"
let urlString = toEscape.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let url = NSURL(string: urlString)
return url!
}
func performLoginRequestWithURL(url: NSURL) -> String? {
let bodyData = "username=\(textEmail.text)&password=\(textPW.text)"
var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
var json = ""
request.HTTPMethod = "POST"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
response, data, error in
if data != nil {
json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
}
println(json)
}
return json
}
func parseJSON(jsonString: String) -> [String: AnyObject]? {
if let data = jsonString.dataUsingEncoding(NSUTF8StringEncoding) {
var error: NSError?
if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &error) as? [String: AnyObject] {
return json
} else if let error = error {
//Here's where the error comes back.
            println("JSON Error: \(error)")
} else {
println("Unknown JSON Error")
}
}
return nil
}
Il n'est pas clair où la chaîne JSON est imprimé, println() jsonString dans le parseJSON méthode et ajouter le à la question.
Je pense que quelque chose se passe pour le json renvoyé par le performLoginRequestWithURL méthode. Je pense que l'erreur peut ne pas être dans la façon dont je suis l'analyse, mais plutôt dans ce qui est retournée. Quand je bouge la println(json) vers le bas au-dessus de retour json la variable est soudainement vide à nouveau.

OriginalL'auteur Nathan McKaskle | 2015-07-03