Es fällt mir schwer zu verstehen, wie die Verkettung von Vervollständigungshandlern mit Verschlüsse funktioniert.Verkettungsverschlüsse und Vervollständigungshandhabung Swift 3
Das Beispiel, das ich mit Arbeit habe, ist folgende:
typealias CompletionHandler = (_ result: AnyObject?, _ error: NSError?) -> Void
func getRequestToken(completionHandler: CompletionHandler){
taskForGET(path: "PathToWebsite.com") { (result, error) in
if let error = error {
print(error)
} else {
print(result)
}
}
}
func taskForGET(path: String, completionHandler: CompletionHandler) {
//URLSESSIONCODE with completion handler
(data, response, error) {
if let error = error {
CompletionHandler(result: nil, error: error)
} else {
let data = data
parseJSON(data: data, completionHandler: completionHandler)
}
}
}
func parseJSON(data: NSData, completionHandler: CompletionHandler) {
//SerializingJSON with do catch block
do {
completionHandler(result: theResult, error: nil)
} catch {
completionHandler(result: nil, error: error)
}
}
Also im Grunde, was dieser Code tut, ist es weg tritt eine GET-Anforderung an einen Server. Wenn die GET-Anforderung Daten zurücksendet, parst sie sie in JSON. Wenn an irgendeinem Punkt auf dem Weg etwas fehlschlägt, wird ein Fehler zurückgegeben.
Ich verstehe im Grunde, was hier vorgeht, aber ich verstehe nicht, wie die Completion Handler abgefeuert werden.
Erste taskForGET wird aufgerufen, die einen Abschluss-Handler als Parameter hat, der ein Ergebnis oder einen Fehler zurückgeben kann, ich habe das.
Der nächste Schritt ist das Aufrufen von parseJSON, wobei die Daten von taskForGET übergeben werden, aber der Completionhandler, der übergeben wird, ist der Beendigungshandler von taskForGET. Ich verstehe das überhaupt nicht.
Dann in ParseJSON, gibt der Abschluss-Handler entweder JSON oder einen Fehler durch Aufruf der Abschluss-Handler von seinen Parametern .. which in diesem Fall ist taskForGET Abschluss Handler?
Ich verstehe den Ablauf nicht. Auch wenn wir JSON erfolgreich analysiert haben, wie wird das Ergebnis von taskForGET jemals wieder in getRequestToken aufgerufen?
Jede Hilfe mit diesem würde geschätzt werden.
Ehrlich gesagt, würde ich empfehlen, die Completion-Handler für alle Prozesse, die Verkettung mehr als 1 von ihnen beinhalten. Mit Versprechungen oder DispatchQueues wäre meiner Meinung nach viel einfacher. – Alexander