快速执行异步任务

7ba*_*all 5 asynchronous ios afnetworking swift

我需要在应用程序上执行一些异步的网络任务。比方说,我有3个资源,我需要从服务器获取,打电话给他们ABC。假设我必须先获取资源,A然后再获取BC。有时,我想先获取B,然后再获取其他时间C

现在,我只有一个像这样的长链关闭:

func fetchA() {
  AFNetworking.get(completionHandler: {
    self.fetchB()
    self.fetchC()
  })
}
Run Code Online (Sandbox Code Playgroud)

现在可以使用,但是明显的限制是我已将执行顺序硬编码到的完成处理程序中fetchA。现在,说我只想fetchC以后fetchB已经在完成处理完了,我不得不去改变我的执行情况fetchB

本质上,我想知道是否有某种神奇的方法可以执行以下操作:

let orderedAsync = [fetchA, fetchB, fetchC]
orderedAsync.executeInOrder()
Run Code Online (Sandbox Code Playgroud)

其中fetchAfetchBfetchC都是异步函数,但fetchB要等到fetchA完成后才能执行。谢谢!

Dáv*_*tor 7

您可以使用串口DispatchQueue与混合DispatchGroup.enter()DispatchGroup.leave()并且DispatchGroup.modify()这将确保只有一个执行块会同时运行。

let serialQueue = DispatchQueue(label: "serialQueue")
let group = DispatchGroup()
group.enter()
serialQueue.async{  //call this whenever you need to add a new work item to your queue
    fetchA{
        //in the completion handler call
        group.leave()
    }
}
serialQueue.async{
    group.wait()
    group.enter()
    fetchB{
        //in the completion handler call
        group.leave()
    }
}
serialQueue.async{
    group.wait()
    group.enter()
    fetchC{
        group.leave()
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果允许您使用第三方库,请使用PromiseKit,它使处理方法(尤其是链接异步方法)比任何GCD提供的方法都容易。有关更多信息,请参见GitHub官方页面。您可以将带有完成处理程序的异步方法包装在Promise中,并将它们链接在一起,如下所示:

Promise.wrap(fetchA(completion:$0)).then{ valueA->Promise<typeOfValueB> in
    return Promise.wrap(fetchB(completion:$0)
}.then{ valueB in

}.catch{ error in
    //handle error
}
Run Code Online (Sandbox Code Playgroud)

同样,所有错误都会通过您的承诺传播。