Как получить изменяемые данные из NSURLRequest - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь извлечь текстовый файл из URL, а затем обработать этот текстовый файл в быстрой форме данных.Это как файл CSV, но использует "|"для разделителя столбцов и "}" для разделителя строк.

Я хотел бы удалить первую "строку" до символа "}" (мой разделитель строк - это "}", чтобы я могциклически перебирайте файл до тех пор, пока он не будет пуст.изменяемый объект данных. Это возможно?

Мой URL-запрос выглядит следующим образом:

    func load(url: String) {

    debugPrint(#function)
    let url = URL(string: url)!
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            self.handleClientError(error: error)
            return
        }
        guard let httpResponse = response as? HTTPURLResponse,
            (200...299).contains(httpResponse.statusCode) else {
                self.handleServerError(error: response)
                return
        }
        debugPrint("data got")

        self.dataGot(data: data!)
        DispatchQueue.main.async {

                self.loadingDelegate!.stockLoadComplete()

        }

    }
    task.resume()


}

В настоящее время я создаю строку из всего файла и выполняю некоторые строковые операции для разделения строк.и столбцы:

        let asString = String(data: data, encoding: String.Encoding.utf8)

    let rows = asString!.components(separatedBy: "}")
    for row in rows {
        self.addPriceLine(line: row)
    }

Этот подход не работает с ошибкой malloc (после успешной обработки нескольких сотен строк), поэтому я подозреваю, что каким-то образом я иду по неверному пути.

IsЕсть ли «хороший» или рекомендуемый подход? Использование только объекта Data кажется мне более элегантным.

Советы приветствуются.

1 Ответ

0 голосов
/ 04 декабря 2018

ОК, поэтому я решил проблему.

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

Я забрелесли это было что-то не так с распределением памяти в замыкании, я помещаю обработку gotData () в основную очередь отправки.Вуаля - malloc ушел.

Очевидно, что есть ограничения на то, что вы должны делать в закрытии, а не в основной очереди отправки, и я предполагаю, что неправильно использовал подход.

:)

        let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            self.handleClientError(error: error)
            return
        }
        guard let httpResponse = response as? HTTPURLResponse,
            (200...299).contains(httpResponse.statusCode) else {
                self.handleServerError(error: response)
                return
        }
        debugPrint("data got")

        DispatchQueue.main.async {
                self.dataGot(data: data!)

                self.loadingDelegate!.stockLoadComplete()

        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...