2016-07-26 4 views
0
public protocol ResponseJSONObjectSerializable { 
    init?(json: SwiftyJSON.JSON) 
} 

public struct Response<Value, Error: ErrorType> { 
... 
} 

public func responseArray<T: ResponseJSONObjectSerializable>(completionHandler: Response<[T], NSError> -> Void) -> Self { 
... 
} 

ich die letzte Funktion zu verstehen, verstehe Bis jetzt analysiert, dass die Typdeklaration T generischen Typen erfordert, die das Protokoll ResponseJSONObjectSerializable folgt, die in einem completionHandler verwendet wird, die eine Response Struktur erfolgt, die hat eine Typdeklaration von <Value, NSError> -> Void und gibt dann eine self zurück?Psychisch func Erklärung mit Generika und Abschluss-Handler

Ich habe das Gefühl, ich könnte alle davon außer dem letzten self Teil.

+0

Werfen Sie einen Blick auf diese Antwort http : //stackoverflow.com/a/33200294/1422333 –

Antwort

0

Sie haben Recht mit den ersten beiden Erklärungen.

Die letzte ist ein bisschen seltsam, weil Alamofire Response-Serializer tut. Sie können die Kette mehrere Serializer wie folgt aus:

Alamofire.request(myRequest) 
    .responseString { // handle response as string } 
    .responseArray { // handle response as array } 

Wenn dieser Code aufgerufen wird, das ist, was passiert:

  • Alamofire.request(myRequest) die Anfrage und eine Warteschlange für Handler
  • .responseString & .responseArray erhalten ihre Antwort Serializer schafft zur Warteschlange hinzugefügt
  • Der Netzwerkanruf passiert
  • Wenn ich Ist das erledigt (ob es fehlschlägt oder erfolgreich ist), ruft die Warteschlange alle Antwort-Serialisierer auf, die hinzugefügt wurden (z. B. .responseString)
  • Wenn jeder Serializer ausgeführt wird, kann der Beendigungshandler verwendet werden, um Ergebnisse "zurückzugeben" an den Aufrufer (die es nicht direkt tun, weil es async ist) würde

Dieser Code funktioniert (fast) das gleiche:

let manager = Alamofire.Manager.sharedInstance 
manager.startsRequestImmediately = false 
let alamofireRequest = manager.request(myRequest) 
alamofireRequest.responseString { // handle response as string } 
alamofireRequest.responseArray { // handle response as array } 
alamofireRequest.resume() 

Aber manager.startsRequestImmediately = false bedeutet, dass das Netzanruf nicht bekommt angefangen bis alamofireRequest.resume() ist calle d. Es ist standardmäßig true, daher müssen alle Antwort-Serializer als Teil derselben Anweisung wie manager.request(myRequest) hinzugefügt werden.

let alamofireRequest = manager.request(myRequest) 
alamofireRequest.responseString { // handle response as string } 
alamofireRequest.responseArray { // handle response as array } 

Um dies:

let alamofireRequest = manager.request(myRequest) 
    .responseString { // handle response as string } 
    .responseArray { // handle response as array } 

Und wenn wir manager.startsRequestImmediately = true verwenden, dann müssen wir nicht die lokale var für die Anfrage

Da die Antwort Serializer selbst zurückkehren, können wir dies verkürzen überhaupt (da wir alamofireRequest.resume() nicht anrufen müssen):

manager.request(myRequest) 
    .responseString { // handle response as string } 
    .responseArray { // handle response as array }