从JSON
请求获取Alamofire
数据后,我想在后台线程上解析它,因为解析过程很困难并且在我的情况下有一些逻辑。要解决的第一个想法是在后台线程上执行async
操作,并使用Alamofire
进行同步请求。但是,正如我所读到的,Alamofire
完全异步工作。我的第二个解决方案是在JSON
的responseJSON
被调用之后在另一个线程中执行解析Alamofire
进程。完成后,我将在主线程中更新我的UI。以下是它的外观:
.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
循环和其他操作,而且,我认为这会导致绘制UI相关的东西。
是的,这是一个很好的方法,但你需要做
DispatchQueue(label: "parsing", qos: .userInitiated).async {
一个实例var作为破坏队列是昂贵的,所以尝试使它1或使用DispatchQueue.global().async
,你也可以使用在后台线程中运行的URLSession.default
,并考虑使用JSONDecoder
而不是swifty json
Alamofire的response
方法采用queue
参数,因此您可以控制闭包运行的位置:
responseJSON(queue: myQueue) { (response)
...
}
只需确保回拨主队列即可。
此外,如果您想使用JSONDecoder
,请更新到Alamofire 5(目前处于测试阶段)或使用responseData
并将该数据输入JSONDecoder
。
太棒了。这是一种非常受尊重的此类任务方法。
它显示了GCD(大中央调度)的灵活性和易用性。
嵌套的GCD调用没有任何问题。