Swift Alamofire SwiftyJSON异步/同步类方法

Swift Alamofire SwiftyJSON异步/同步类方法,swift,asynchronous,synchronous,alamofire,swifty-json,Swift,Asynchronous,Synchronous,Alamofire,Swifty Json,因此,我目前有以下几点: class ViewController: UIViewController { class Identity{ let baseUrl = "superSecretURL" var _username: String = "" var _password: String = "" var _apiKey: String = "" init(){ } init(username: String, apiKe

因此,我目前有以下几点:

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.
}


}
基本上,我希望能够调用println(“调用前”),然后从loginPassword()方法接收响应,然后调用println(“调用后”)。我相信这是同步的,但我想不出一个办法让它工作,整个线程的事情一直困扰着我的头

我基本上想说:

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

非常感谢您的帮助或指点。

您需要设置一个回调函数,以便在
loginPassword()
函数中随时调用

这可能是实现这一目标的一种方式:

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)
      }
    }
}
然后

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
        }

    }
}
更新

此外,您的调用函数可以如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    var identity = Identity(username: "John Apleseed", apiKey: "213123123")
    identity.loginPassword(handlePasswordRequest)
}
您可以根据需要添加尽可能多的回调处理程序,而无需使用一堆嵌套闭包

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

如果需要深入调用层次结构调用回调,则需要将回调作为以前每个闭包的参数传递

更新3


我想尝试一下RxAlamofire和所有关于RxSwift的内容,非常感谢!有没有一种方法可以通过承诺把这些联系在一起,这样就不会让筑巢看起来那么糟糕了?在应用程序的另一半过程中,这可能会深入到4-5个级别?您知道Swift 2中的原始答案是什么样的吗?它在swift 1.2中对我有效,但现在似乎删除了错误参数。我的问题是关于this@HugoAlonso我希望看到回调示例的RxAlamofire嵌套。你能提供一个要点吗?谢谢