2016-08-01 28 views
0

Ich bin neu in Alamofire, und die Logik ist ein wenig verwirrend für mich. Ich bezweifle, wenn Alamofire immer Completion-Handler erst nach der Anfrage hinzugefügt wird gefeuert. Hier ist zum Beispiel das Anwendungsbeispiel von Alamofire Github.Alamofire-Netzwerkanforderung wurde vor dem Hinzufügen des Abschlussblocks ausgelöst?

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) 
    .responseJSON { response in 
     print(response.request) // original URL request 
     print(response.response) // URL response 
     print(response.data)  // server data 
     print(response.result) // result of response serialization 

     if let JSON = response.result.value { 
      print("JSON: \(JSON)") 
     } 
    } 

Im .request(.GET... Verfahren wird die Anforderung selbst wieder aufgenommen wird, und dann zurückgegeben. Gleich danach ruft die zurückgegebene Anforderung die Methode .responseJSON(... auf, um einen Abschlussrückruf zu einer Warteschlange hinzuzufügen. Ist es nicht zu spät, einen Rückrufblock zu initiieren, da die Anfrage bereits ausgelöst wurde? Normalerweise feuern wir eine Anfrage immer erst, nachdem wir sie vollständig eingerichtet haben, oder?

Unter der Aufsicht von Charles fand ich jedoch, dass Alamofire-Anfragen erst nach der .responseJSON-Methode gesendet wurden.

Also, bitte sag mir, wie ich Alamofire's Logik missverstanden habe. Danke!

+0

ist es das gleiche Login in jquery Erfolg –

Antwort

0

Der Beendigungshandler ist nicht nützlich, bis eine Antwort zurückgegeben wird. Und wenn eine Antwort zurückgegeben wird, ruft Alamofire den Handler automatisch auf. Wenn der Handler hinzugefügt wird, nachdem die Antwort zurückgegeben wurde, ruft Alamofire den Handler sofort auf (aus diesem Grund können Sie jederzeit mehrere Handler hinzufügen, die alle aufgerufen werden).

0

Wie wäre es, wenn Sie so versuchen?

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) 
     .responseJSON { response in 
      print(response.request) // original URL request 
      print(response.response) // URL response 
      print(response.data)  // server data 
      print(response.result) // result of response serialization 

      let result = response.result 
      switch result { 
       case .Success(let data): 
        let json = JSON(data) 
        completed(JSONObject: json, error: nil) 
        break 
       case .Failure(let error): 
         completed(JSONObject: nil, error: error) 
         break 
       } 
     }