2017-05-17 1 views
0

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.

+0

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

Antwort

1

Es gibt nur einen Abschluss-Handler, der von einer Methode zu einer anderen übergeben wird.

Lets deklarieren Sie den Handler separat, BTW. Swift in 3 wegzulassen die Parameterbezeichnungen in der Art alias:

typealias CompletionHandler = (Any?, Error?) -> Void 

let handler : CompletionHandler = { (result, error) in 
    if let error = error { 
     print(error) 
    } else { 
     print(result) 
    } 
} 

Dieser Verschluss am Ende des Prozesses ausgeführt werden soll. Nun ist die getRequestToken Methode sieht aus wie

func getRequestToken(completionHandler: CompletionHandler){ 
    taskForGET(path: "PathToWebsite.com", completionHandler: handler) 
} 

Der Handler/Abschluss als Parameter getRequestToken-taskForGET geleitet wird und dann taskForGET-parseJSON aber es ist immer das gleiche Objekt.

+0

Okay, hier kam meine massive Verwirrung. Ich dachte nicht daran, dass ein Objekt herumgereicht wurde. Vielen Dank, das war super hilfreich! – user6820041