Ios 使用AFN网络在SWIFT上发出post请求后显示另一个控制器
我有一个登录控制器。键入用户名和密码后,单击“登录”按钮。在“登录”按钮中。这是我调用post的登录代码,我已经在登录控制器中定义了webservicecontrollerIos 使用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
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的新手(从我开始学习到现在才一个月)。我搜索了你提到的可以解决我问题的东西,但我似乎无法理解你的意思。我很抱歉。没关系,我们都得从某个地方开始。你试过使用我提供的代码吗?谢谢。成功了。我不能用文字来表达它,但我可以向你们保证,我现在的感觉是超越幸福的。我希望你们能帮助更多的人,我希望我的问题对很多人都有用。