2016-07-13 17 views
2

私は何かを確認する前にユーザの情報を検証する一連の関数を記述しようとしています。 (ショッピングアプリを想像してみてください)。Swiftで複数の非同期関数を連結する

  1. まず、ユーザーがカードを追加したことを確認する必要があります。
  2. 次に、十分なバランスがあることを確認する必要があります。
  3. 次に、お支払いを確認するように依頼することができます。

私は、これは今

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

しかし... ...このように実行することができます

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() // 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」私に見える私が代わりに好きな本の線に沿って何かあるだろうと何

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!") 
    } 
} 

...

しかし、それは乱雑ます...このようなものに近づく方法がわからない。

方法はありますか?

+1

https://github.com/mxcl/PromiseKitのようなものを使用することができます –

+1

反応性パラダイム(ReactiveCocoaとRXSwiftライブラリの両方)を見てみましょう。この種の抽象化には便利です。明らかに、ここに必要なものよりも多くの機能がテーブルにもたらされます。 –

答えて

6

非同期操作、順序付けされた依存関係はありますか?あなたはNSOperationについて説明しています。確かに

あなたがチェーンのタスクが使用できGCD:

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

は、しかし、あなたの操作が複雑であれば、例えば彼らには代表者がいて、そのアーキテクチャは完全に破壊されています。 NSOperationを使用すると、複雑な操作を自分のやり方でカプセル化することができます。

+0

特に、先進的なNSOperationには昨年から素晴らしい素晴らしいビデオがあります。これはコヒーレントにこのようなことをする方法を教えてくれます。 – matt

+0

ああ、これまでNSOperationでこれをやっており、それについて忘れていました。もう一度見てみましょう。それはそれが上品なクロージャーとそれ以外のものでそれがスウィフトの領域内にあるかもしれないことを望んでいた。 WWDCビデオを見てみましょう。 Thansk – Fogmeister

+1

これは次のようなものです:http://asciiwwdc.com/2015/sessions/226そして、そこには非常に素晴らしいコードサンプルプロジェクトがあります。これはあなたの心を完全に吹き飛ばすでしょう。 – matt

関連する問題