Ios AFN网络用户登录异步问题

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 :

当用户按下登录按钮时,将发送登录post请求。 然后我想从这个post请求中获取结果,不管它是否成功

我的发帖要求:

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
参数调用一个完成块,并且应该从AFN
success
failure
块调用它(因为此时您知道登录的结果状态)

因此,您的登录方法是:

func login (username: String, password: String, completion: ((success: Bool) -> Void)!)
在帖子回复中,您会:

println("Login")
self.defaults.setBool(true, forKey: "USERLOGGEDIN")
completion(true)

你能写几行代码吗?这样我就更容易理解你的概念了。我能用NSNotificationCenter解决这个问题吗?你可以用通知来解决,但这可能并不理想(除非应用程序中的许多控制器需要了解登录事件)。