2015-05-12 10 views
6

So habe ich noch folgendes:Swift Alamofire SwiftyJSON Asynchronous/Synchronous Klassenmethoden

class ViewController: UIViewController { 

class Identity{ 
    let baseUrl = "superSecretURL" 
    var _username: String = "" 
    var _password: String = "" 
    var _apiKey: String = "" 

    init(){ 

    } 

    init(username: String, apiKey: String){ 
     _username = username 
     _apiKey = apiKey 
    } 

    init(username: String, password: String){ 
     _username = username 
     _password = password 
    } 

    func loginPassword() -> String{ 
     var loginJSON = ["auth": ["passwordCredentials": ["username": _username, "password": _password]]]; 
     var returnJSON: String 

     request(.POST, baseUrl, parameters: loginJSON, encoding: .JSON) 
      .responseJSON { (request, response, data, error) in 
       if let anError = error 
       { 
        // got an error in getting the data, need to handle it 
        println("error calling POST on /posts") 
        println(error) 
       } 
       else if let data: AnyObject = data 
       { 
        // handle the results as JSON, without a bunch of nested if loops 
        let post = JSON(data) 
        // to make sure it posted, print the results 
        println("JSON Returned") 
       } 
     } 
    } 
} 

var i = Identity(username: "secretName", password: "complicatedPassword") 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    println("Before Call") 



    println("After Call") 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

Grundsätzlich würde ich die println können gerne anrufen („Vor Call“), dann eine Antwort von der Loginpassword erhalten () Methode und dann println ("Nach dem Anruf"). Dies ist, glaube ich, synchron, aber ich kann keinen Weg finden, es zum Laufen zu bringen, und das ganze Threads-Ding hat mir den Kopf verblüfft.

Ich möchte grundsätzlich in der Lage sein, zu sagen:

if i.loginPassword(){ // do some login stuff }else{ // do some error stuff } 

Jede Hilfe oder Zeiger geschätzt.

Antwort

8

Sie müssen eine Rückruffunktion festlegen, die innerhalb Ihrer loginPassword()-Funktion aufgerufen wird.

Das es sich um eine Art und Weise zu erreichen sein könnte:

func loginPassword(callback: ((isOk: Bool)->Void)?) -> String{ 
var loginJSON = ["auth": ["passwordCredentials": ["username": _username, "password": _password]]]; 
var returnJSON: String 

request(.POST, baseUrl, parameters: loginJSON, encoding: .JSON) 
    .responseJSON { (request, response, data, error) in 
     if let anError = error{ 
     // got an error in getting the data, need to handle it 
     println("error calling POST on /posts") 
     println(error) 

     callback?(isOk: false) 
     } 
     else if let data: AnyObject = data{ 
     // handle the results as JSON, without a bunch of nested if loops 
     let post = JSON(data) 
     // to make sure it posted, print the results 
     println("JSON Returned") 

     callback?(isOk: true) 
     } 
    } 
} 

und dann ...

override func viewDidLoad() { 
    super.viewDidLoad() 

    var identity = Identity(username: "John Apleseed", apiKey: "213123123") 

    identity.loginPassword { (isOK) -> Void in 
     if (isOK) { 
      //do good stuff here 
     }else{ 
      // do error handling here 
     } 

    } 
} 

UPDATE

Auch kann Ihre Berufung Funktion wie folgt aussehen:

override func viewDidLoad() { 
    super.viewDidLoad() 

    var identity = Identity(username: "John Apleseed", apiKey: "213123123") 
    identity.loginPassword(handlePasswordRequest) 
} 

und Sie können so viele Callback-Handler hinzufügen, wie Sie ohne Herumspielen mit einem Bündel von verschachtelten Verschlüsse benötigen ...

private func handlePasswordRequest(isOK: Bool){ 
    if (isOK) { 
     //do good stuff here 
    }else{ 
     // do error handling here 
    } 
} 

UPDATE 2

Wenn Sie in Not sind, einen Rückruf anzurufen tief in die Hierarchie der Anrufe, dann müssen Sie den Rückruf als Parameter für alle früheren Schließungen weitergeben.

UPDATE 3

ich einen Versuch RxAlamofire und alles über RxSwift

+0

Brilliant Dank geben würde! Gibt es eine Möglichkeit, dies mit Versprechungen zu verbinden, so dass es mit der Verschachtelung nicht so böse aussieht? Dies könnte während der anderen Hälfte der Anwendung möglicherweise 4-5 Ebenen tief gehen? –

+0

Ich werde meine Antwort aktualisieren, um Ihnen einen anderen Weg zu zeigen ... –

+0

Wissen Sie, wie die ursprüngliche Antwort in Swift 2 aussieht? Es hat für mich in swift 1.2 funktioniert, aber jetzt scheint der Fehler-Parameter entfernt zu sein. [Hier] (http://StackOverflow.com/Questions/32277680/Alamofire-Post-Request-with-Swift-2) ist meine Frage zu diesem – mattgabor

Verwandte Themen