Как проанализировать JSON в фоновом потоке после завершения запроса Alamofire? - PullRequest
0 голосов
/ 12 февраля 2019

После получения JSON данных из запроса Alamofire я хочу проанализировать их в фоновом потоке, потому что процесс синтаксического анализа труден и имеет некоторую логику в моем случае.Первой идеей, которая была решена, было выполнение операции async в фоновом потоке с синхронным запросом с Alamofire.Но, как я прочитал, Alamofire работает полностью асинхронно.Вторым моим решением было выполнение процесса синтаксического анализа JSON в другом потоке после вызова responseJSON из Alamofire.После его завершения я обновлю свой интерфейс в главном потоке.Вот как это выглядит:

.responseJSON { (response) in //callback of Alamofire
    if response.result.isSuccess {
        let json = JSON(response.result.value!)
        DispatchQueue(label: "parsing", qos: .userInitiated).async {
            self.parseJSON(json)
            DispatchQueue.main.async {
                self.updateUI()
            }
        }
    }
}

Но хороший ли это подход для решения этой проблемы?Я просто не хочу анализировать JSON в главном потоке, потому что в процессе разбора есть пара циклов for и другие операции, и, я думаю, это вызывает рисование вещей, связанных с пользовательским интерфейсом.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Да, это хороший подход, но вам нужно сделать

DispatchQueue(label: "parsing", qos: .userInitiated).async {

экземпляром var, поскольку создание очереди стоит дорого, поэтому попробуйте сделать это 1 или использовать DispatchQueue.global().async, вы также можетеиспользуйте URLSession.default, который работает в фоновом потоке, и рассмотрите возможность использования JSONDecoder вместо swifty json

0 голосов
/ 12 февраля 2019

Методы Alamofire response принимают параметр queue, поэтому вы можете контролировать, где выполняется закрытие:

responseJSON(queue: myQueue) { (response) 
    ...
}

Просто убедитесь, что вы перезваниваете в главную очередь.

Кроме того, если вы хотите использовать JSONDecoder, обновитесь до Alamofire 5 (в настоящее время в бета-версии) или используйте responseData и введите эти данные в JSONDecoder.

0 голосов
/ 12 февраля 2019

Это прекрасно.Это очень уважаемый подход к этому типу задач.

Он показывает, насколько гибок и прост в использовании GCD (большая центральная диспетчеризация).

Нет ничего плохого во вложенных вызовах GCD для отправки.

...