我对api调用几乎没有理论上的疑问。我只是想知道,假设一个控制器中有4个api调用,它们相互依赖,那么我应该如何调用它们。对于前
call A()
call B()
call C()
call D()//give A,B,C output to D AS input
另一个疑问是,如果一个控制器中有两个调用彼此没有连接,那么使用串行队列是一个好的做法吗?
对于这种情况,可以使用DispatchGroup
。
1.创建DispatchGroup
的实例
let dispatchGroup = DispatchGroup()
2.创建aOutput, bOutput, cOutput
以存储调用A(), B(), C()
的方法后收到的api响应。
var aOutput = ""
var bOutput = ""
var cOutput = ""
3.在A(), B(), C()
内的dispatchGroup
上调用enter()
和leave()
方法
func A() {
dispatchGroup.enter()
if let url = URL(string: "") {
URLSession.shared.dataTask(with: url) { (data, response, error) in
aOutput = "A Done"
dispatchGroup.leave()
}
}
}
func B() {
dispatchGroup.enter()
if let url = URL(string: "") {
URLSession.shared.dataTask(with: url) { (data, response, error) in
bOutput = "B Done"
dispatchGroup.leave()
}
}
}
func C() {
dispatchGroup.enter()
if let url = URL(string: "") {
URLSession.shared.dataTask(with: url) { (data, response, error) in
cOutput = "C Done"
dispatchGroup.leave()
}
}
}
func D() {
//use aOutput, bOutput, cOutput here
print(aOutput, bOutput, cOutput)
}
4.在dispatchGroup
中添加一个观察者,以便在收到所有3个api响应时发出通知。
dispatchGroup.notify(queue: .main) {
//A, B, C - Done
D()
}
5.现在,从控制器调用方法A(), B(), C()
func callApis() {
A()
B()
C()
}
Swift通常是同步的,这意味着在A((完成执行后,B((将被调用。同样适用于B和C等。
如果你想传递输出,它看起来像这样:
let resultA = A()
let resultB = B()
let resultB = C()
D(resultA, resultB, resultC)
控制器中的这两个调用是做什么的?他们有一些共同点,比如访问相同的资源?
串行队列适合一次执行一个任务,例如,当您不希望两个任务访问同一个文件时,它很有用。
并发任务将允许两个任务同时访问同一文件(这可能会导致问题(