2016-06-03 4 views
1

Im Moment habe ich eine Funktion, die JSON-Daten zurückgibt, in diesem JSON-Daten ein Zugriffstoken (Funktion verwendet sowohl AlamoFire & SwiftyJSON):In Swift, wie eine Funktion zu schreiben, die eine andere Funktion auslöst, sobald es abgeschlossen ist?

func getAccessToken (username: String, password: String) { 

    //code// 

    Alamofire.request(.POST, "\(baseURL)/oauth2/token", parameters: parameters, encoding: .JSON, headers: headers) 

     .responseJSON { response in 
      if((response.result.value) != nil) { 

       let swiftyJsonVar = JSON(response.result.value!) 

       self.accessToken = swiftyJsonVar["access_token"].stringValue 

      } 
    } 
} 

Sobald ich das Zugriffstoken erhalten möchte ich eine andere Funktion sein mit dem Zugriffstoken ausgelöst, die gerade gekommen waren:

func createNewMember (username: String, password: String, accessToken: String) { 
    //code// 
} 

ich dachte an einen Verschluss auf der getAccessToken Funktion, die das Zugriffstoken zurück und löst die createNewMember Funktion ist aber nicht ganz sicher, wie es einzurichten. Jede Hilfe wird geschätzt!

+0

können Sie Ihren Code allgemeinere machen? Und ist der erste Snipper eine Methode? Wenn dies der Fall ist, möchten Sie möglicherweise eine Klasse für den Kontext einschließen. –

+0

Sie können eine Schließung verwenden, wenn Sie die beiden Codeabschnitte oder NSNotification für eine lose Kopplung eng koppeln möchten. – Paulw11

+0

Warum implementieren Sie nicht einfach 'createNewMember' als eine normale Methode und rufen Sie sie aus dem' .responseJSON' Closure, den Sie bereits haben, auf? –

Antwort

2

Ich würde vorschlagen, ein completionHandler Muster, eine Schließung, die Sie aufrufen, wenn der getAccessToken Anruf erfolgt, die entweder das Token oder den Fehler zurückgeben kann:

func getAccessToken (username: String, password: String, completionHandler: (String?, ErrorType?) ->()) { 

    //code// 

    Alamofire.request(.POST, "\(baseURL)/oauth2/token", parameters: parameters, encoding: .JSON, headers: headers) 
     .responseJSON { response in 
      guard let value = response.result.value else { 
       completionHandler(nil, response.result.error) 
       return 
      } 

      let swiftyJsonVar = JSON(value) 
      completionHandler(swiftyJsonVar["access_token"].string, nil) 
    } 
} 

Sie würden es dann rufen mit dem Abschluss-Handler Schließung:

getAccessToken(username, password: password) { token, error in 
    guard let accessToken = token where error == nil else { 
     // handle error here 

     print(error) 
     return 
    } 

    self.createNewMember(username, password: password, accessToken: accessToken) 
} 
+0

Die Funktion createNewMember wird nur einmal aufgerufen. Was würde in der CompletionHandler übergeben werden, wenn es nichts zurückgeben muss? – SwiftyJD

+0

Was meinst du mit "wenn es nichts zurückgeben muss"? Wenn Sie ein Token und den Aufruf 'createNewMember' erhalten möchten, tun Sie das oben genannte. Wenn Sie mit diesem Token ein Token abrufen und etwas anderes tun möchten, ersetzen Sie dieses Closure, das 'createNewMember' aufruft, mit Code, der etwas anderes tut. Ich verstehe deine Frage nicht. – Rob

+0

ok, das macht Sinn. Danke für die Eingabe! – SwiftyJD

-1

Dies umfasst das Setup - createNewMember ist eine Schließung, die als Argument an getAccessToken übergeben wird, und wird vom Aufrufer implementiert. Auf diese Weise wird der Anrufer empfangen und entscheiden, was mit dem Zugriffstoken zu tun ist, sobald es abgerufen wird.

// Added createNewMember as a parameter 
func getAccessToken (username: String, password: String, createNewMember:(username: String, password: String, accessToken: String)) { 

    //code// 

    Alamofire.request(.POST, "\(baseURL)/oauth2/token", parameters: parameters, encoding: .JSON, headers: headers) 

     .responseJSON { response in 
      if((response.result.value) != nil) { 

       let swiftyJsonVar = JSON(response.result.value!) 

       self.accessToken = swiftyJsonVar["access_token"].stringValue 
       // Call the closure after retrieving the access token 
       createNewMember(username, password, self.accessToken) 
      } 
    } 
} 
Verwandte Themen