我的函数总是第一次返回false

时间:2015-10-17 15:34:04

标签: swift function nsurlsession

这可能是一个模糊的问题,但我似乎无法弄清楚这里发生了什么。我有一个"登录"用于检查API的用户名和密码的函数。出于某种原因,第一次调用此函数会返回 false ,但如果我第二次调用该函数,则返回正确的true,假设我输入了正确的凭据。

这是功能:

if testLogin(usernameTextField.text!, password: passwordTextField.text!) {
            performSegueWithIdentifier("dismissLogin", sender: self)
        } else {
            let alert = UIAlertView()
            alert.title = "Login Problem"
            alert.message = "Wrong username or password."
            alert.addButtonWithTitle("Dismiss")
            alert.show()
        }
    }

此处显示 testLogin 功能;

func testLogin(username: String, password: String) -> Bool {

    let jsonString = "{\"username\":\"\(username)\",\"password\":\"\(password)\"}"
    let myURL = "http://myurl.com/api/login.php"

    let url:NSURL = NSURL(string: myURL)!
    let session = NSURLSession.sharedSession()

    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

    request.HTTPBody = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

    let task = session.dataTaskWithRequest(request) {
        (
        let data, let response, let error) in

        guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else {
            print("error")
            return
        }

        do {
            let json:AnyObject? = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)

            if let result = json as? [String: AnyObject] {
                if let status = result["Status"] as! Int? {
                    if status == 200 {
                        self.loginCheck = true
                    } else {
                        self.loginCheck = false
                    }
                }
            }
        } catch {
            print(error)
        }            
    }   
    task.resume()
    return loginCheck
}

抱歉这个长度。我似乎无法理解,为什么第一次调用testLogin会返回 false ,但第二次调用它会返回true。几乎就好像该功能没有足够快地调用网站并且返回false,但是第二次调用该函数时,它有时间检查网站?

1 个答案:

答案 0 :(得分:1)

您的方法testLogin不正确。方法dataTaskWithRequest是异步的。您需要创建两个回调successfailure(闭包)。如果请求完成,将调用该文件。看看这个https://github.com/Alamofire/Alamofire