Ios 使用AFN网络在SWIFT上发出post请求后显示另一个控制器

Ios 使用AFN网络在SWIFT上发出post请求后显示另一个控制器,ios,swift,Ios,Swift,我有一个登录控制器。键入用户名和密码后,单击“登录”按钮。在“登录”按钮中。这是我调用post的登录代码,我已经在登录控制器中定义了webservicecontroller let urlString = "http://app.sampleurl.com:3000/sign-up" let params = ["User[username]":txtUsername.text, "User[email]":txtEmail.text, "User[pas

我有一个登录控制器。键入用户名和密码后,单击“登录”按钮。在“登录”按钮中。这是我调用post的登录代码,我已经在登录控制器中定义了webservicecontroller

let urlString = "http://app.sampleurl.com:3000/sign-up"
                    let params = ["User[username]":txtUsername.text, "User[email]":txtEmail.text, "User[password]":txtPassword.text]
                    webService.postRequestFromUrl(urlString, withDictionary: params, withHeader: false)
               if let isSuccess = webService.response["success"] as? Bool{
                    if (isSuccess){
                        if let getData = webService.response["data"] as? NSDictionary{
                            if let token = getData["token"] as? NSDictionary{
                                if let passport = token["passport"] as? String{
                                    defaults.setValue(passport, forKey: "token")
                                }
                            }
                            if let user = getData["user"] as? NSDictionary{
                                if let username = user["username"] as? String{
                                    defaults.setValue(username, forKey: "username")
                                }
                                if let email = user["email"] as? String{
                                    defaults.setValue(email, forKey: "email")
                                }
                                if let score = user["score"] as? Int{
                                    defaults.setValue(score, forKey: "score")
                                }
                            }
                            let sidePanel = JASidePanelController()
                            let dashController = DashboardController()
                            let menuController = MenuViewController()
                            let navDashController = UINavigationController(rootViewController: dashController)
                            sidePanel.centerPanel = navDashController
                            sidePanel.leftPanel = menuController
                            self.presentViewController(sidePanel, animated: true, completion: nil)
                        }

                    else{
                        println("error on sign-up")
                        }
                    }
                }
以下是webserviceController中的代码

var response: NSDictionary = [:]
let defaults = NSUserDefaults.standardUserDefaults()
func postRequestFromUrl(urlString: String, withDictionary parameters:[NSObject:AnyObject], withHeader: BooleanType){
   let manager = AFHTTPRequestOperationManager()
    NSLog("Request Parameters: %@", parameters);
         manager.POST(urlString, parameters: parameters, success: {(operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
            println("JSON: " + responseObject.description)
            if let responseData = responseObject as? NSDictionary {
                self.response = responseData
            }
            }, failure: {(operation: AFHTTPRequestOperation!,error: NSError!) in
                println("Error: " + error.localizedDescription)
            })
}

问题是,当单击登录按钮时,isSuccess仍然为false,因为请求尚未完成,当请求到达时,isSuccess如果最终为true,则由于已经执行而太迟。从昨天起我就一直在寻找解决办法。我不允许在登录控制器中添加post请求,因为这会使WebServiceController变得无用,我必须按照导师的指示使用它。谢谢。

原因是
postRequestFromUrl
函数调用异步AFNetworking函数
POST
。该方法在请求完成之前返回

您需要为
postRequestFromUrl
函数提供一个回调块,当从AFNetworking调用
success
failure
块时,将调用该回调块

let urlString = "http://app.sampleurl.com:3000/sign-up"
let params = ["User[username]":txtUsername.text, "User[email]":txtEmail.text, "User[password]":txtPassword.text]

// The trailing block will be invoked when the response has been received.
// Note that this method will still return BEFORE the response has been received.
webService.postRequestFromUrl(urlString, withDictionary: params, withHeader: false) { success in
    if (success) {
        ...
    }
}
以及更新后的
postRequestFromUrl

func postRequestFromUrl(urlString: String, withDictionary parameters:[NSObject:AnyObject], withHeader: BooleanType, callback: (success: Bool) -> ()) {

    let manager = AFHTTPRequestOperationManager()
    NSLog("Request Parameters: %@", parameters);
    manager.POST(urlString, parameters: parameters, success: {(operation: AFHTTPRequestOperation!,responseObject: AnyObject!)in
        println("JSON: " + responseObject.description)
        if let responseData = responseObject as? NSDictionary {
            self.response = responseData

            // Invoke the supplied callback block to inform the caller that the request finished
            callback(true)
        }
        }, failure: {(operation: AFHTTPRequestOperation!,error: NSError!) in
            println("Error: " + error.localizedDescription)

            // Invoke the supplied callback block to inform the caller that the request finished
            callback(false)
        })

}

我认为您正在寻找的已经在web服务控制器中。它做街区里的事。我正在寻找一些可能会在请求完成时进行检测的东西,以便我可以让另一个控制器显示,或者一些只在请求完成时才执行
if(issucess)
块的东西。在
成功
(或
失败
)中会发生什么在返回
postRequestFromUrl
后发生阻塞。因此,为了让您的登录控制器知道响应已经完成,它需要回调。这就是我所描述的。我会用一些示例代码更新答案,也许这会让答案更清楚。很抱歉,我不能达到您的期望,但我是swift的新手(从我开始学习到现在才一个月)。我搜索了你提到的可以解决我问题的东西,但我似乎无法理解你的意思。我很抱歉。没关系,我们都得从某个地方开始。你试过使用我提供的代码吗?谢谢。成功了。我不能用文字来表达它,但我可以向你们保证,我现在的感觉是超越幸福的。我希望你们能帮助更多的人,我希望我的问题对很多人都有用。