Am Ende des Tages, eine vereinfachte Version des Codes den traditionellen Ansatz des „Abschluss-Handler“ verwendet, kann wie folgt aussehen:
fetchOAuthToken() { (token, error) in
if let token = token {
fetchPrivileges(token: token) { (privileges, error) in
if let privileges = privileges {
fetchData(token: token, privileges: privileges) { (data, error) in
if let data = data {
// ...
}
}
}
}
}
}
Beachten Sie, dass der Code nicht nur Fehlerbehandlung und keine Möglichkeit zum Abbrechen enthält.
Die Abhängigkeiten werden durch die Fortsetzungen - also die Completion-Handler eingerichtet.
Einen anderen Ansatz „Scala-like“ Futures verwendet, wird wie folgt aussehen (mit Promises ist ganz ähnlicher Ansatz):
fetchOAuthToken().flatMap { token in
fetchPrivileges(token: token).flatMap { privileges in
fetchData(token: token, privileges).map { data in
// ...
}
}
}.onFailure { error in
print("Error: \(error)")
}
Die Anweisung erstellt über eine Aufgabe, die aus drei zusammengesetzt ist.
Dieser Ansatz enthält vollständige Fehlerbehandlung, auch wenn es nicht offensichtlich ist. Die Produktionsversion unterscheidet sich nicht wesentlich von diesem oben genannten Snippet - es kann nur ein Löschmittel hinzugefügt werden.
Es gibt einige Bibliotheken von Drittanbietern, die Scala-ähnliche Futures oder Promises implementieren.
Ein Ansatz Hinzufügen Stornierung, kann wie folgt aussehen:
let cr = CancellationRequest()
fetchOAuthToken(ct: cr.token).flatMap { token in
fetchPrivileges(token: token, ct: cr.token).flatMap { privileges in
fetchData(token: token, privileges, ct: cr.token).map { data in
// ...
}
}
}.onFailure { error in
print("Error: \(error)")
}
Später können Sie die zusammengesetzte Aufgabe aufheben (was auch immer es gerade ausgeführt wird):
cr.cancel()
Hinweis:
Dieses Problem kann auch mit NSOperations
gelöst werden. Es würde jedoch drei Unterklassen von NSOperation
und eine oder zwei threadsichere Hilfsklassen erfordern, die verwendet werden, um das Ergebnis von Op1 an den Eingang von Op2 und das Ergebnis von Op2 an den Eingang von Op3 "zu übertragen". Ich würde schätzen, dass dies etwa 500 Zeilen Code - zu viel für eine Antwort auf SO nehmen wird;)
Die "Scala-like" Futures-Ansatz erfordert eine Drittanbieter-Bibliothek. Die Stornierung erfordert eine andere - oder Ihre eigene Implementierung (die nicht so schwierig ist), oder eine Bibliothek, die alles in einem bietet.
Wird diese Methode ausprobiert oder erraten? weil, das Hinzufügen einer Datatask in einer Datatask gibt mir einen Fehler –
Nein, ich hatte dies in der Vergangenheit verwendet. Ich hatte Daten zu API übergeben, die von anderen API von Vervollständigungshandler kommen. – Lion
Machen Sie drei verschiedene Methoden, um diese drei Operationen durchzuführen. von Methode 1 der Vervollständigungshandleraufrufmethode mit dem Übergeben erforderlicher Daten und von Methode 2 der Vervollständigungshandleraufrufmethode durch Übergeben erforderlicher Daten. – Lion