2017-02-11 78 views
0

爲我的應用程序,我從互聯網上下載一個包含XML並且必須被解析的文件。 我遇到的問題是:一旦文件下載,我嘗試加載它的內容到一個NSData變量,所以我可以調用解析函數,但我沒有得到預期的結果。如何將下載的文件加載到NSData變量

因此該過程是這樣的:

  1. 我下載使用URLSession(這是正確的,因爲我已經手動打開文件,並驗證其內容是有效的)

    令任務= downloadsSession文件.downloadTask(具有:作爲lobj_Request的URLRequest)

    task.resume()

  2. 委託方法didFinishD ownloadingToURL被觸發,我用它來嘗試下載該文件的內容爲NSData的變量

    讓XMLDATA = NSData的(contentsOf:location.absoluteURL)

  3. 我打印XMLDATA的內容和而不是得到的XML我得到的是這樣的:

Xcode output

所以我不知道我做錯了。

任何提示,幫助或建議,將不勝感激。

Regards

回答

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兩次;)你已經下載了數據,如果它沒有被緩存,委託可能會因爲同步調用'contentsOf:location'而長時間阻塞 –

+0

@Daij:不,請查看文檔:'location'是l本地臨時文件。儘管如此,你還是在做一些額外工作中的「真正」工作,請再次參閱文檔:'如果選擇打開文件進行閱讀,則應該在另一個線程中進行實際閱讀,以避免阻塞委託隊列。 –

+0

對不起。撤銷投票 –

0

你看到的NSData的原始字節 - 你希望看到的「解碼字符串內容」的原始字節表示。

所以XMLDATA可能是數字的串,每個都是一個字節:
7402874 243721 2342111 2342342 234234

的使得所表示的字符串是從所表示的字符組裝:
let xmlString = String(WithData:xmlData, encoding:NSUTF8StringEncoding)


放進入會話的任務完成塊 - 不要嘗試與會話的委託。

+0

是的,但是當你想要一個字符串時不要使用NSData,因爲這會增加內存影響。 –