首页 > 解决方案 > 关于 Swift Api 调用

问题描述

我对 api 调用几乎没有理论上的怀疑。我只是想知道假设一个控制器中是否有 4 个相互依赖的 api 调用,那么我应该如何调用它们。例如

call A() 
call B() 
call C() 
call D()//give A,B,C output to D AS input

另一个疑问是,如果一个控制器中有 2 个调用彼此没有连接,那么使用串行队列是一个好习惯吗?

标签: swift

解决方案


您可以DispatchGroup用于这种情况。

1.创建一个实例DispatchGroup

let dispatchGroup = DispatchGroup()

2.创建aOutput, bOutput, cOutput存储调用方法后收到的api响应A(), B(), C()

var aOutput = ""
var bOutput = ""
var cOutput = ""

3.内部调用enter()leave()方法dispatchGroupA(), B(), C()

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()
}

推荐阅读