Ios AFN网络用户登录异步问题
当用户按下登录按钮时,将发送登录post请求。 然后我想从这个post请求中获取结果,不管它是否成功 我的发帖要求:Ios AFN网络用户登录异步问题,ios,swift,asynchronous,afnetworking-2,Ios,Swift,Asynchronous,Afnetworking 2,当用户按下登录按钮时,将发送登录post请求。 然后我想从这个post请求中获取结果,不管它是否成功 我的发帖要求: func login (username: String, password: String) -> Bool { var param = ["username": username, "password": password] POST(APIURL.URL_LOGIN, parameters: param, { (operation :
func login (username: String, password: String) -> Bool {
var param = ["username": username, "password": password]
POST(APIURL.URL_LOGIN, parameters: param,
{ (operation : NSURLSessionDataTask!, response : AnyObject!) -> Void in
println("Login")
self.defaults.setBool(true, forKey: "USERLOGGEDIN")
}, { (operation : NSURLSessionDataTask!, error : NSError!) -> Void in
self.defaults.setBool(false, forKey: "USERLOGGEDIN")
})
if (self.defaults.boolForKey("USERLOGGEDIN") == true) {
return true
}
else if (self.defaults.boolForKey("USERLOGGEDIN") == false) {
return false
}
else {
return false
}
}
我的按钮呼叫:
@IBAction func login(sender: AnyObject) {
var username: NSString = userid.text
var userpassword: NSString = password.text
//Loginroutine
var flag = (_sharedAPIManager.login(userid.text, password: password.text)) as Bool
if ( flag == true) {
println("correct password")
} else {
println("false password")
}
}
}
我有时不得不按两次登录按钮。
我认为这个问题与使用不同线程的网络有关
如何以优雅的方式解决此问题?这不是因为AFN使用不同的线程,而是因为您没有正确处理它(并且您要求它)的事实。那是因为你的爱的方式:
func登录(用户名:String,密码:String)->Bool{
正在返回一个Bool
,但当它返回时,异步登录将不会完成
您的函数不应该返回Bool
,而应该使用Bool
参数调用一个完成块,并且应该从AFNsuccess
和failure
块调用它(因为此时您知道登录的结果状态)
因此,您的登录方法是:
func login (username: String, password: String, completion: ((success: Bool) -> Void)!)
在帖子回复中,您会:
println("Login")
self.defaults.setBool(true, forKey: "USERLOGGEDIN")
completion(true)
你能写几行代码吗?这样我就更容易理解你的概念了。我能用NSNotificationCenter解决这个问题吗?你可以用通知来解决,但这可能并不理想(除非应用程序中的许多控制器需要了解登录事件)。