有没有将函数调用排队的方法?

时间:2019-07-17 11:10:03

标签: swift swift4

为了在结帐过程中与后端通信,我具有异步功能:

create():在后端创建购物车。当用户选择结帐页面时调用。

update():在后端编辑购物车。当用户编辑购物车时调用。

confirm():确认在后端购买。当用户下订单时调用。

update()依赖于 create()的响应, confirm()依赖于 create()的响应 / update()

用户可以调用一个功能,而另一个功能未完成,例如,在搜索到结帐页面后不久即可编辑购物车。由于依赖关系,这会导致问题。

我目前已经通过使用 processing shouldUpdate shouldConfirm 这些布尔变量来半解决它。

是否有一种方法可以通过使用队列来完成,在该队列中下一个函数调用要等到上一个函数调用完成为止?

var processing = false // Set true when a function is executing
var shouldUpdate = false // Set true when user edits cart
var shouldConfirm = false // Set true when user taps "Purchase"
var checkoutID = ""

func create() {
    processing = true
    APIClient.sharedClient.createShoppingCart() {
    (checkoutID, error) in
       ...
       processing = false // Finished with network call
       if shouldUpdate { // if edit was done while create() is running
           update()
           shouldUpdate = false
       }
       if shouldConfirm { // if user tapped "Purchase" while create() is running
           confirm()
       }
    }
}

func update() { // Called from view controller or create()
    if processing {return}
    processing = true
    APIClient.sharedClient.updateShoppingCart(forCheckoutID: checkoutID) {
    (error) in
       ...
       processing = false // Finished with network call
       if shouldConfirm { // if user tapped "Purchase" while update() is running
           confirm()
       }

    }
}

func confirm() { // Called from view controller or create()/update()
    if processing {return}
    APIClient.sharedClient.confirmPurchase(forCheckoutID: checkoutID) {
    (error) in
       ...
       /// Finish order process
    }
}

2 个答案:

答案 0 :(得分:1)

我个人使用 PromiseKit -不错的文章generally here,用async here包装-和how to promises here

// your stack
var promises = [];

// add to your stack
promises.push(promise); // some promise func, see above links
promises.push(promise2);

// work the stack
when(fulfilled: promiseArray).then { results in
    // Do something
}.catch { error in
    // Handle error
}

类似解决方案的关键字:Promises,Deferred,Async Stacks。


或: 您可以实现以下内容:

有一个池,一组数组:methodhandler和bool(=执行为true)

创建一个func(1)在另一个包装函数(2)中运行数组中的所有func,该函数将在执行时设置tupels bool。

func(1)会等到更换教堂之后,再抓取下一个。

答案 1 :(得分:1)

您可以使用调度组

let apiDispatchGroup = DispatchGroup()

func asyncCall1() {
    apiDispatchGroup.enter()
    print("Entered")
    DispatchQueue.main.asyncAfter(deadline: .now()+3) {
        /// After 3 Second it will notify main Queue
        print("Task 1 Performmed")
        /// Let's notify
        apiDispatchGroup.leave()
    }

    apiDispatchGroup.notify(queue: .main) {
        /// Perform task 2
        asyncCall2()
    }
}

func asyncCall2() {
    print("Task 2")
}