Alamofire请求完成后,如何在后台线程中解析JSON?

时间:2019-02-12 09:27:12

标签: ios json swift multithreading alamofire

JSON请求中获得Alamofire数据后,我想在后台线程上对其进行解析,因为解析过程很困难并且在我的情况下有一定逻辑。要解决的第一个想法是在后台线程上执行async操作,并与Alamofire进行同步请求。但是,据我所读,Alamofire完全异步工作。我的第二个解决方案是在调用JSON的{​​{1}}之后,在另一个线程中执行一个解析responseJSON过程。完成后,我将在主线程中更新UI。外观如下:

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循环和其他操作,而且我认为这会导致绘制UI相关内容。

3 个答案:

答案 0 :(得分:2)

是的,这是一个好方法,但是您需要进行

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

实例var因为要排队很昂贵,因此请尝试使其为1或使用DispatchQueue.global().async,也可以使用在后台线程中运行的URLSession.default并考虑使用{{1} }而不是迅速的json

答案 1 :(得分:2)

Alamofire的response方法采用一个queue参数,因此您可以控制在何处运行闭包:

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

只需确保您回叫到主队列即可。

此外,如果您想使用JSONDecoder,请更新到Alamofire 5(当前处于beta版)或使用responseData并将数据输入JSONDecoder

答案 2 :(得分:1)

这很完美。对于这类任务,这是一种备受推崇的方法。

它展示了GCD(大型中央调度)的灵活性和易用性。

嵌套的GCD调用没有任何问题。