2017-02-11 8 views
0

私のアプリでは、XMLを含むインターネットからファイルをダウンロードし、解析する必要があります。 私が抱えている問題は、ファイルがダウンロードされると、その内容をNSData変数にロードしようとするため、解析関数を呼び出すことができますが、期待した結果が得られません。ダウンロードしたファイルをNSData変数にロードする方法

ので、手順はこのように書き:

  1. 私はURLSessionを使用してファイルをダウンロードする(私は手動でファイルを開いて、その内容が有効である確認したので、これは正しいです)

    のletタスク= downloadsSession .downloadTask(持つ:URLRequestのようlobj_Request)

    task.resume()

  2. デリゲートメソッドdidFinishD ownloadingToURLがトリガされ、私はNSDataの変数にファイルの内容をロードしようとするためにそれを使用

    てみましょうです。xmlData =のNSData(contentsOf:location.absoluteURL)

  3. は私がです。xmlDataの内容を印刷し、代わりに取得します

Xcode output

だから私は私が間違っているのかわからない:XMLは、私はこのような何かを得ます。

ヒント、助け、アドバイスなどありがとうございます。

ありがとうございます。

答えて

0

NSDataを使用する理由はありますか?私は直接文字列を使用することをお勧め:

class del : NSObject, URLSessionDownloadDelegate { 
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { 
     let result = try? String(contentsOf: location) 
     if let result = result { 
      print (result) 
     } 
    } 
} 
+0

最後にURLを2回ダウンロードすることができました。)既にデータをダウンロードしていて、キャッシュされていなければ、 'contentsOf:location'への同期呼び出しのためにデリゲートが長時間ブロックされる可能性があります。 –

+0

@Daij:いいえ、ドキュメントをチェックしてください: 'location'はローカルの一時ファイルです。それにもかかわらず、余分な踏み台で「本当の」作業をすることは正しいです。ドキュメントをもう一度見てください。 '読み込みのためにファイルを開くことを選択した場合、デリゲートキューをブロックしないように、 –

+0

申し訳ありません。失われた投票 –

0

あなたはNSDataのの生のバイトを参照してください - あなたは、生のバイトが表す「デコードされた文字列の内容」を参照してください期待しています。

そうです。xmlDataは数字の文字列であるかもしれない、それぞれがバイトであること:
その表現の文字列を表す文字から組み立てられ 7402874 243721 2342111 2342342 234234


let xmlString = String(WithData:xmlData, encoding:NSUTF8StringEncoding)


プットそれをセッションのタスク補完ブロックに入れる - セッションのデリゲートと一緒に行こうとしないでください。

+0

はい、文字列が必要なときはNSDataを使用しないでください。これはメモリの影響を倍にするためです。 –

関連する問題