在Swift中链接多个异步函数

时间:2016-07-13 14:48:43

标签: ios swift asynchronous closures

我尝试编写一系列功能,在要求他们确认某些内容之前验证用户的信息。 (想象一下购物应用程序)。

  1. 我首先要检查用户是否添加了卡片。
  2. 然后我必须检查他们是否有足够的余额。
  3. 然后我可以要求他们确认付款。
  4. 我可以编写异步方法来检查卡片......

    func checkHasCard(completion: (Bool) -> ()) {
        // go to the inter webs
        // get the card
        // process data
        let hasCard: Bool = // the user has a card or not.
        completion(hasCard)
    }
    

    这可以像这样运行......

    checkHasCard {
        hasCard in
        if hasCard {
            print("YAY!")
        } else {
            print("BOO!")
        }
    }
    

    但是......现在,基于我必须做各种事情。如果用户确实有卡,那么我需要继续向前并检查是否有足够的余额(以同样的方式)。如果用户没有卡,我会出示一个屏幕,供他们添加卡片。

    但它变得混乱......

    checkHasCard {
        hasCard in
        if hasCard {
            // check balance
            print("YAY!")
            checkBalance {
                hasBalance in
                if hasBalance {
                    // WHAT IS GOING ON?!
                    print("")
                } else {
                    // ask to top up the account
                    print("BOO!")
                }
            }
        } else {
            // ask for card details
            print("BOO!")
        }
    }
    

    我想要的是这样的......

    checkHasCard() // if no card then show card details screen
        .checkBalance() // only run if there is a card ... if no balance ask for top up
        .confirmPayment()
    

    这看起来更多" swifty"但我不确定如何接近这样的事情。

    有办法吗?

1 个答案:

答案 0 :(得分:6)

异步操作,有序和依赖?您正在描述NSOperation。

当然,您可以使用GCD链接任务:

DispatchQueue.main.async {
    // do something
    // check something...
    // and then:
    DispatchQueue.main.async {
        // receive info from higher closure
        // and so on
    }
}

但如果您的操作很复杂,例如他们有代表,这个架构完全崩溃了。 NSOperation允许以您之后的方式封装复杂的操作。