Почему JSONDecoder.decode (_: from :) от swift занимает 10-15 секунд всего для 1 Мб данных? - PullRequest
0 голосов
/ 31 января 2020

Я использую JSONDecoder от swift для декодирования JSON данных размером около 1 МБ. У моего JSON есть куча вложенных объектов. Я декодирую, используя init (из декодера :), чтобы декодировать мои JSON данные. Проблема в том, что декодирование JSON занимает около 10-15 секунд только после того, как вызов API вернется с успешным ответом. Почему это происходит (размер моих данных не такой большой)? Кроме того, как я могу сократить это время?

Я тестирую на iPhone 6 и на симуляторе Xcode. Вызов API занимает около 1-2 секунд, чтобы получить JSON.

Я использую Моя Вот пример моего вызова API:

API.provider.request(API.getDetails(id: courseID), completion:  { [weak self] result in
        switch result {
        case .success(let response):
            do {
                var results = try JSONDecoder().decode(MiniDetailApiResponse.self, from: response.data)
                delegate?.success(results)
              }catch{
                 delegate?.failure()
              }
}

1 Ответ

0 голосов
/ 31 января 2020

Декодирование с JSON, вероятно, не займет много времени, если вы не делаете что-то очень интересное в пользовательском init(from: Decoder), но вы не включили ничего из MinDetailApiResponse в свой вопрос, поэтому трудно сказать.

Если ваша цифра 10-15 секунд получена из-за того, что вы ждете, чтобы что-то изменилось на экране, то наиболее вероятной причиной является то, что указанный выше запрос API не вызывается в главном потоке, который часто проявляет себя как большая задержка для обновления пользовательского интерфейса.

Поставьте точку останова на var results = try... выше, и когда она попадет, посмотрите в навигаторе отладки - вы в главном потоке?

enter image description here

Если нет, вам следует вызвать ваш метод делегата в главном потоке:

DispatchQueue.main.async { delegate?.success(results) }
...