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

问题描述 投票:0回答:3

JSON请求获取Alamofire数据后,我想在后台线程上解析它,因为解析过程很困难并且在我的情况下有一些逻辑。要解决的第一个想法是在后台线程上执行async操作,并使用Alamofire进行同步请求。但是,正如我所读到的,Alamofire完全异步工作。我的第二个解决方案是在JSONresponseJSON被调用之后在另一个线程中执行解析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相关的东西。

ios json swift multithreading alamofire
3个回答
2
投票

是的,这是一个很好的方法,但你需要做

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

一个实例var作为破坏队列是昂贵的,所以尝试使它1或使用DispatchQueue.global().async,你也可以使用在后台线程中运行的URLSession.default,并考虑使用JSONDecoder而不是swifty json


2
投票

Alamofire的response方法采用queue参数,因此您可以控制闭包运行的位置:

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

只需确保回拨主队列即可。

此外,如果您想使用JSONDecoder,请更新到Alamofire 5(目前处于测试阶段)或使用responseData并将该数据输入JSONDecoder


1
投票

太棒了。这是一种非常受尊重的此类任务方法。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.