Ios 阿拉莫菲尔请求完成后,如何在后台线程中解析JSON?

Ios 阿拉莫菲尔请求完成后,如何在后台线程中解析JSON?,ios,json,swift,multithreading,alamofire,Ios,Json,Swift,Multithreading,Alamofire,从Alamofire请求中获取JSON数据后,我想在后台线程上解析它,因为在我的例子中,解析过程很困难,并且有一些逻辑。解决的第一个想法是在后台线程上执行async操作,使用Alamofire执行同步请求。但是,正如我所读到的,Alamofire完全异步工作。我的第二个解决方案是在调用Alamofire的responseJSON后,在另一个线程中执行解析JSON过程。完成后,我将在主线程中更新我的UI。下面是它的外观: .responseJSON { (response) in //callba

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

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

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


嵌套的GCD调用调度没有什么问题。

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

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

创建队列的实例变量代价很高,因此请尝试将其设为1或使用
DispatchQueue.global().async
,也可以使用在后台线程中运行的
URLSession.default
,考虑使用<代码> JSONDecoder <代码>,而不是快捷的JSON/P> < P > ALAMOFIR的代码>响应< /代码>方法采用<代码>队列< /C>参数,这样您就可以控制闭包在哪里运行:

responseJSON(queue: myQueue) { (response) 
    ...
}
只要确保你回电话到主队列


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

为什么Alamofire异步会出现问题?你发布的答案也不错。但是,我认为如果阿拉莫菲尔有这样一个功能就好了。因为,在我的第一个选择中,我的想法是为网络创建另一个线程。基本上,我不在乎在这种情况下是同步还是异步,因为它不会阻止UI。我很乐意使用JSONDecoder,但Alamofire目前不支持它。它支持,你可以用数据而不是json来响应,你可以在另一个相关问题中分享你的json问题,也可以告诉我,但最后要考虑的是,关于上面的代码>队列< /COD>创建变量的建议。这有什么意义?我只执行一次代码。如果我将
队列
分配给某个变量,它无论如何都不会被使用。如果它是一个请求,那么您当前的方法是可以的,如果您有我预期的多个请求,那么使用全局队列IMHO,创建调度队列并没有那么昂贵。Alamofire实现本身的开销要大得多,它在NSOperationQueue.main上按默认值进行调度(这实际上很昂贵)。更好的方法是告诉Alamofire在调用完成处理程序时使用不同的队列,如@JonShier所建议的。使用一个标准的全局调度队列是调度闭包的最快方法,也是最“经济”的方法,也是最友好的用户界面。