2017-02-11 4 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

Так что я не знаю, что я делаю неправильно.

Подсказка, помощь или совет будут оценены.

С уважением

ответ

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 дважды;) вы уже загрузили данные. И если он не был кэширован, делегат мог заблокировать длительное время из-за синхронного вызова в «contentOf: location» –

+0

@Daij: Нет, проверьте документацию: 'location' - это локальный временный файл. Тем не менее, вы правы, когда выполняете «настоящую» работу в дополнительном проходе, снова смотрите документ: «Если вы решите открыть файл для чтения, вы должны сделать фактическое чтение в другом потоке, чтобы избежать блокировки очереди делегатов». –

+0

Извините. Заблокированное голосование –

0

вы видите необработанные байты NSData - вы ожидаете увидеть «декодированного содержимое строки», что исходные байты представляют.

так XMLDATA может быть строкой чисел, каждый из которых являются байты:
7402874 243721 2342111 2342342 234234

представляемой строка, которая собрана из персонажей, представленные:
let xmlString = String(WithData:xmlData, encoding:NSUTF8StringEncoding)


нанесенных что в блок завершения задачи сеанса - не пытайтесь идти с делегатом сессии.

+0

Да, но не используйте NSData, когда хотите строку, потому что это удвоит влияние памяти. –

Смежные вопросы