Ich versuche, eine Reihe von Funktionen zu schreiben, die die Benutzerinformationen validieren, bevor sie aufgefordert werden, etwas zu bestätigen. (Stellen Sie sich eine Shopping-App vor).Verketten mehrerer Async-Funktionen in Swift
- Ich muss zuerst überprüfen, dass der Benutzer eine Karte hinzugefügt hat.
- Dann muss ich überprüfen, ob sie ein ausreichendes Gleichgewicht haben.
- Dann kann ich sie bitten, die Zahlung zu bestätigen.
kann ich die Asynchron-Methode schreiben die Karte so etwas wie zu überprüfen ...
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)
}
Dies kann wie folgt ...
checkHasCard {
hasCard in
if hasCard {
print("YAY!")
} else {
print("BOO!")
}
}
Aber ... jetzt ausgeführt werden, davon ausgehend muss ich verschiedene Dinge tun. Wenn der Benutzer eine Karte hat, muss ich weiter fortfahren und prüfen, ob ein ausreichender Kontostand vorhanden ist (auf die gleiche Weise). Wenn der Benutzer keine Karte hat, zeige ich ihm einen Bildschirm an, auf dem er seine Karte hinzufügen kann.
Aber es wird chaotisch ...
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!")
}
}
Was würde Ich mag stattdessen ist etwas entlang der Linien von diesem ...
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()
Das sieht viel mehr „swifty“ aber ich bin mir nicht sicher, wie ich so etwas näher kommen könnte.
Gibt es einen Weg?
Sie können etwas wie https://github.com/mxcl/PromiseKit verwenden –
Werfen Sie auch einen Blick auf das reaktive Paradigma (sowohl mit ReactiveCocoa und RXSwift-Bibliothek), es ist nützlich für diese Art von Abstraktionen. Offensichtlich bringt es viel mehr Funktionen auf den Tisch als die, die Sie hier brauchen. –