这可能是一个晦涩的问题,但是我似乎无法弄清楚这里正在发生什么。我有一个“登录”功能,可以根据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则返回true。好像该函数没有足够快地调用网站并返回false,但是第二次我调用该函数时,它有时间检查该网站吗?
您的方法testLogin
不正确。方法dataTaskWithRequest
是异步的。您需要创建两个回调success
和failure
(关闭)。如果请求完成,将调用该方法。看看这个https://github.com/Alamofire/Alamofire。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句