0

サーバーからjsonデータを取得するためにhttp get requestを行うNSURLSessionデリゲートの方法を使用しています。私はそうのような配列を更新するモデルオブジェクトに私のNSURLSessionDataDelegateで受信したNSDataに渡し終わる:データを切り捨てるnsjsonserialization.jsonobjectwithdataデータを受信しました

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { 
    networkDelegate?.updateGameList(data) 
    dataTask.resume() 
} 

データがupdateGameList機能にその方法を作るたら、私はNSJSONSerializationを使用しようとすると、奇妙なものが起こります。 JSONObjectWithData。私はNSDataのを使用しようと、しかし

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"}]) 

:私はNSJSONSerializationを使用しようと、単なる文字列にNSDataのを変換しない場合、それは私が、このような何かを期待しています適切な対応のように見えます

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.} 

ここで私はキャッチをコメントアウトするとき、updateGameList機能である:これは以下のようにNSJSONSerialization.JSONObjectWithDataはNSArrayのを作るために、それは、データが先頭または末尾のいずれか切り捨てられているように見えるので、エラーをスローを開始しますJSONSerializationコードをブロックし、dataStringが正しい応答を出力します。コメントを外すと、multiplyを実行しますそれは一度にすべてではなく、一度にデータをチャンクで処理しようとしているようなものです。 .AllowFragmentsオプションを取り出すと、それを挿入するよう指示されます。挿入すると、jsonデータが正しく開始または終了しないという実際のエラーになります。文書からの引用

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

} 
+0

文字通り、NSDataをいくつかの文字制限で断片化していることに気付きました。そのため、最初に印刷されたデータが最初に印刷され、不適切に終了した場合、そこから2番目のデータが続き、印刷が不適切に開始されます。だから、それをチャンクで処理しようとしていますが、私は理由を知らないのです。 – uRockNinja

+0

コメントにコンテンツやコードを投稿しないでください。代わりに[編集]ボタンを使用して質問を編集してください。ありがとうございました! :) – Moritz

答えて

1

このデリゲートメソッドが複数回呼び出されることができ、各コール は、前の呼び出し以降、受信したデータのみを提供します。このアプリケーションは、必要に応じてこのデータを蓄積するための責任を負う です。

だから何を観察しているのは機能です:データが(元のサーバーがTransfer-Encoding: chunkedを使用しているため、最も可能性が高い)のチャンクで受信され、したがって、あなたは、個別に各チャンクを解析できることを期待することはできません - あなたはよすべてのチャンクを1つの応答から集める必要があります。この応答を解析してみることができます。

関連する問題