7ba*_*all 5 asynchronous ios afnetworking swift
我需要在应用程序上执行一些异步的网络任务。比方说,我有3个资源,我需要从服务器获取,打电话给他们A,B和C。假设我必须先获取资源,A然后再获取B或C。有时,我想先获取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)
其中fetchA,fetchB和fetchC都是异步函数,但fetchB要等到fetchA完成后才能执行。谢谢!
您可以使用串口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)
同样,所有错误都会通过您的承诺传播。
| 归档时间: |
|
| 查看次数: |
3182 次 |
| 最近记录: |