从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相关内容。
答案 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调用没有任何问题。