Ich benutze die NSURLSession Delegat Möglichkeit, http Abruf erhalten, um JSON-Daten von einem Server zu erhalten. Ich beende im NSData erhielt in meinem NSURLSessionDataDelegate auf ein Modell-Objekt übergibt bis zu einem Array zu aktualisieren, wie so:nsjsonserialization.jsonobjectwithdata abgeschnitten Daten empfangen
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
networkDelegate?.updateGameList(data)
dataTask.resume()
}
Sobald die Daten ihren Weg in die updateGameList Funktion machen, seltsame Dinge passieren, wenn ich versuche, NSJSONSerialization zu verwenden. JSONObjectWithData. Wenn ich versuche, nicht NSJSONSerialization zu verwenden und lediglich die NSData in eine Zeichenfolge zu konvertieren, es sieht aus wie die richtige Antwort ich erwarte, so etwas wie diese:
Optional([{"id":"a19610e4-675e-40b3-8335-085b61bfb0e3","name":"tttt","status":"PLAYING"},
{"id":"3be2e411-0086-46fd-8fc9-38d11831d0fb","name":"LWP TEST","status":"PLAYING"},
{"id":"b5d97d73-1ce2-4e5b-8b38-805835e2a21d","name":"asd","status":"PLAYING"},
{"id":"8a15575c-4c2c-4b46-ad5b-51b4b2680416","name":"MsGame","status":"WAITING"},
{"id":"b54531b8-5323-4630-929c-6eb2cfebde63","name":"423","status":"PLAYING"},
{"id":"5a7cfaa0-e2a4-41f6-bda2-a854a2d00a57","name":"4234","status":"PLAYING"}])
Allerdings, wenn ich versuche, die NSData zu verwenden, um mit NSJSONSerialization.JSONObjectWithData um eine NSArray zu machen, es beginnt zu werfen Fehler, weil die Daten abgeschnitten zu sein scheint entweder am Anfang oder Ende, wie folgt aus:
Optional([{"id":"a19610e4-675e-40b3-8335-085b61bfb0e3","name":"tttt","status":"PLAYING"},{"id":"3be2e411-0086-46fd-8fc9-38d11831d0fb","name":"LWP TEST","status":"PLAYING"},
{"id":"6d4e9731-61be-4191-bb9a-a30b6395a4a2","name":"RANDOMBOT","status":"PLAYING"},{"id":"c31b363c-f565-4f4a-a6f1-1ac219425f40","name":"Testament ","status":"PLAYING"},
{"id":"af14d8bc-37a0-4ec3-88de-ee364344d720","name":"Testament ","status":"PLAYING"},
{"id":"29439dd9-357d-445b-856c-39862e19c2fc","name":"Testament ","status":"PLAYING"},{"id":"cc29046f-4e80-422d-a103-5be175e799c9","name":"matt7","status":"PLAYING"},
{"id":"ff75c546-0e9b-4560-8efb-d0fa5be61cde","name":"u","status":"DONE"},{"id":"3d88df55-6f84-469c-a18e-27e463dc30eb","name":"test","status":"PLAYING"},{"id":"40eb1b13-21c3-4c8d-a379-e6b85329374b","name":"test","status":"PLAYING"},
{"id":"4e7519dd-79d3-4229-8d0e-47ca112dc08f","name":"test","status":"PLAYING"},{"id":"32ce49cc-17aa-47ca-8b9f-1c35dbdb78e6","name":"test","status":"PLAYING"},
{"id":"f5d5c961-17eb-421d-86b1-fbbadfb795da","name":"test","status":"PLAYING")
update game list error Error Domain=NSCocoaErrorDomain Code=3840
"Unexpected end of file while parsing object."
UserInfo={NSDebugDescription=Unexpected end of file while parsing object.}
Hier ist die updateGameList Funktion ist, wenn ich die do-Fang auf Kommentar Blockieren Sie mit dem JSONSerialization-Code darin, der DataString druckt die richtige Antwort aus, wenn ich es auskommentiere, läuft es multiples Die Zeiten, fast wie es versucht, die Daten ein Stück auf einmal statt alle auf einmal zu verarbeiten. Wenn ich die .AllowFragments-Option herausbringe, sagt sie mir, dass ich sie einfügen soll. Wenn ich sie einfüge, kommt es zum echten Fehler, dass die JSON-Daten nicht korrekt starten oder enden.
func updateGameList(gameListData:NSData) {
let dataString = NSString(data: gameListData, encoding: NSUTF8StringEncoding)
print(dataString)
do {
let gameList:NSArray = try NSJSONSerialization.JSONObjectWithData(gameListData, options: [.AllowFragments]) as! NSArray
}
catch {
print("update game list error \(error)")
}
}
Ich habe gerade festgestellt, dass es die NSData im wahrsten Sinne des Wortes in Stücke zerschneidet. So sind die ersten ausgedruckten Daten der Anfang und das Ende falsch, dann laufen die zweiten ausgedruckten Daten von dort weiter und beginnen unsachgemäß. Es versucht also, es in Blöcken zu verarbeiten, aber ich weiß nicht warum. – uRockNinja
Bitte posten Sie keinen Inhalt oder Code in Kommentaren. Verwenden Sie die Schaltfläche [Bearbeiten], um stattdessen Ihre Frage zu bearbeiten. Vielen Dank! :) – Moritz