带有 POST 请求的完成处理程序
Completion handler with POST request
我有简单的登录方法,returns bool,取决于用户登录是否成功。我对响应顺序和代码执行有疑问。我读过有关完成处理程序的信息,我认为这是解决我的问题的方法,但我不确定。这是我的方法:
//perform user login in, setting nsuserdefaults and returning the bool result
func login(username: String, password:String) -> (Bool) {
var success:Bool = false
//sending inputs to server and receiving info from server
let postRequest = postDataToURL()
postRequest.link = "http://pnc.hr/rfid/login.php"
postRequest.postVariables = "username=" + username + "&password=" + pass
word
postRequest.forData("POST") { jsonString in
// getting the result from the asinhronys task
let result = convertStringToDictionary(jsonString as String)
if let loggedIn = result?["loggedIn"] as? Bool where loggedIn == true {
let userType = result?["userType"] as? String
let token = result?["token"] as? String
//if user is logged - setting parameters in Key Chains and redirecting them to the menu view
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(loggedIn, forKey: "loggedIn")
defaults.setObject(username, forKey: "username")
defaults.setObject(userType, forKey: "userType")
defaults.setObject(token, forKey: "token")
success = true
}
else {
success = false
}
print ("class - " + String(jsonString))
print ("classIN - " + String(success))
}
print ("classOUT - " + String(success))
return success
}
我想在检查变量 loggedIn 的 if 语句中使成功变量 return 等于 true。但在那种情况下我会出错。
那我就做了这个方法。问题是 return 方法比 POST 请求更快地完成变量成功。所以它在任何情况下都是错误的。我打印了变量以查看代码执行的顺序,方法首先打印 "classOUT"、returns 变量,然后设置变量值并打印 "classIN"。
我怎样才能等到记录用户的代码被执行,这样我才能获得变量 success 的正确值?
执行用户登录,设置nsuserdefaults并返回bool结果
completionBlock:
是当您像任何块一样调用它时将执行的块,但您可以选择何时以及通过该块的所有内容。
func login(username: String, password:String,completionBlock : ((success : Bool)->Void)){
//sending inputs to server and receiving info from server
let postRequest = postDataToURL()
postRequest.link = "http://pnc.hr/rfid/login.php"
postRequest.postVariables = "username=" + username + "&password=" + password
postRequest.forData("POST") { jsonString in
// getting the result from the asinhronys task
let result = convertStringToDictionary(jsonString as String)
if let loggedIn = result?["loggedIn"] as? Bool where loggedIn == true {
let userType = result?["userType"] as? String
let token = result?["token"] as? String
//if user is logged - setting parameters in Key Chains and redirecting them to the menu view
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(loggedIn, forKey: "loggedIn")
defaults.setObject(username, forKey: "username")
defaults.setObject(userType, forKey: "userType")
defaults.setObject(token, forKey: "token")
completionBlock(success:true)
}
else {
completionBlock(success:false)
}
}
}
当你调用它时,它看起来像这样:-
login(username: String, password:String,completionBlock : { (success) in
print(success)
})
你可以这样做
func login(username: String, password: String, completion: (Bool) -> ()) {
... YOUR USUAL NETWORKING CODE ...
completion(success)
}
然后调用它
login(username: anonymous, password: ******) { authStatus in
if authStatus == true {
print("user in")
} else {
print("try one more time")
}
}
我有简单的登录方法,returns bool,取决于用户登录是否成功。我对响应顺序和代码执行有疑问。我读过有关完成处理程序的信息,我认为这是解决我的问题的方法,但我不确定。这是我的方法:
//perform user login in, setting nsuserdefaults and returning the bool result
func login(username: String, password:String) -> (Bool) {
var success:Bool = false
//sending inputs to server and receiving info from server
let postRequest = postDataToURL()
postRequest.link = "http://pnc.hr/rfid/login.php"
postRequest.postVariables = "username=" + username + "&password=" + pass
word
postRequest.forData("POST") { jsonString in
// getting the result from the asinhronys task
let result = convertStringToDictionary(jsonString as String)
if let loggedIn = result?["loggedIn"] as? Bool where loggedIn == true {
let userType = result?["userType"] as? String
let token = result?["token"] as? String
//if user is logged - setting parameters in Key Chains and redirecting them to the menu view
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(loggedIn, forKey: "loggedIn")
defaults.setObject(username, forKey: "username")
defaults.setObject(userType, forKey: "userType")
defaults.setObject(token, forKey: "token")
success = true
}
else {
success = false
}
print ("class - " + String(jsonString))
print ("classIN - " + String(success))
}
print ("classOUT - " + String(success))
return success
}
我想在检查变量 loggedIn 的 if 语句中使成功变量 return 等于 true。但在那种情况下我会出错。
那我就做了这个方法。问题是 return 方法比 POST 请求更快地完成变量成功。所以它在任何情况下都是错误的。我打印了变量以查看代码执行的顺序,方法首先打印 "classOUT"、returns 变量,然后设置变量值并打印 "classIN"。
我怎样才能等到记录用户的代码被执行,这样我才能获得变量 success 的正确值?
执行用户登录,设置nsuserdefaults并返回bool结果
completionBlock:
是当您像任何块一样调用它时将执行的块,但您可以选择何时以及通过该块的所有内容。
func login(username: String, password:String,completionBlock : ((success : Bool)->Void)){
//sending inputs to server and receiving info from server
let postRequest = postDataToURL()
postRequest.link = "http://pnc.hr/rfid/login.php"
postRequest.postVariables = "username=" + username + "&password=" + password
postRequest.forData("POST") { jsonString in
// getting the result from the asinhronys task
let result = convertStringToDictionary(jsonString as String)
if let loggedIn = result?["loggedIn"] as? Bool where loggedIn == true {
let userType = result?["userType"] as? String
let token = result?["token"] as? String
//if user is logged - setting parameters in Key Chains and redirecting them to the menu view
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(loggedIn, forKey: "loggedIn")
defaults.setObject(username, forKey: "username")
defaults.setObject(userType, forKey: "userType")
defaults.setObject(token, forKey: "token")
completionBlock(success:true)
}
else {
completionBlock(success:false)
}
}
}
当你调用它时,它看起来像这样:-
login(username: String, password:String,completionBlock : { (success) in
print(success)
})
你可以这样做
func login(username: String, password: String, completion: (Bool) -> ()) {
... YOUR USUAL NETWORKING CODE ...
completion(success)
}
然后调用它
login(username: anonymous, password: ******) { authStatus in
if authStatus == true {
print("user in")
} else {
print("try one more time")
}
}