auf den großen Punkte zu erweitern @dasblinkenlight und @Sulthan gemacht hat - hier ist ein kleines Beispiel, wie Sie Ihre Anfrage Funktion zu übernehmen einen Erfolg und Misserfolg Schließung, in der praktischen Syntax erreichen könnten, die Sie wollen.
Zuerst müssen Sie eine neue Klasse definieren, die den 'Ergebnishandler' darstellt. Dies ist, was Ihre success
und failure
Funktionen weitergeben werden, so dass Sie mehrere abschließende Schließungen hinzufügen können, um Ihre Abschlussblocklogik zu bilden. Sie werden es in etwa so aussehen wollen:
class ResultHandler {
typealias SuccessClosure = RequestHandler.Output->Void
typealias FailureClosure = Void->Void
// the success and failure callback arrays
private var _successes = [SuccessClosure]()
private var _failures = [FailureClosure]()
/// Invoke all the stored callbacks with a given callback result
func invokeCallbacks(result:RequestHandler.Result) {
switch result {
case .Success(let output): _successes.forEach{$0(output)}
case .Failure: _failures.forEach{$0()}
}
}
// remove all callbacks – could call this from within invokeCallbacks
// depending on the re-usability of the class
func removeAllCallbacks() {
_successes.removeAll()
_failures.removeAll()
}
/// appends a new success callback to the result handler's successes array
func success(closure:SuccessClosure) -> Self {
_successes.append(closure)
return self
}
/// appends a new failure callback to the result handler's failures array
func failure(closure:FailureClosure) -> Self {
_failures.append(closure)
return self
}
}
Dies ermöglicht es Ihnen, mehr Erfolg oder Misserfolg Schließungen zu definieren nach Abschluss ausgeführt werden. Wenn Sie nicht die Kapazität für mehrere Closures benötigen, können Sie die Klasse vereinfachen, indem Sie die Arrays entfernen - und stattdessen nur die zuletzt hinzugefügten Blöcke für Erfolgs- und Fehlerkomplettierung verfolgen.
Alles was Sie jetzt tun müssen, ist eine Funktion zu definieren, die eine neue ResultHandler
Instanz erzeugt und dann tut eine gegebene asynchrone Anforderung, mit der invokeCallbacks
Methode nach Abschluss aufgerufen wird:
func doRequest(input:Input) -> ResultHandler {
let resultHandler = ResultHandler()
doSomethingAsynchronous(resultHandler.invokeCallbacks)
return resultHandler
}
Jetzt können Sie es nennen wie dies:
doRequest(input).success {result in
print("success, with:", result)
}.failure {
print("fail :(")
}
Das einzige, was zu beachten ist, Ihre doSomethingAsynchronous
Funktion muss seine Fertigstellung Block zurück zum Hauptthread versenden, Thread-Sicherheit zu gewährleisten.
Voll Projekt (mit zusätzlichem Beispiel nach Verwendung): https://github.com/originaluser2/Callback-Closure-Chaining
Sie ein Objekt zurückgeben kann, die 'success' und' failure' Eigenschaft hat und die 'success' Setter gibt auch, dass Sie btw kann promiseKit verwenden, das es tut http://promisekit.org/ –
Sie können meinen Artikel versuchen, der genau das tut: [Verketten von asynchronen Funktionen in Swift] (https://medium.com/@jhoumuck/composing-asynchronous-functions- in-swift-acd24cf5b94a) – zeitgeist7