Обработчик завершения с запросом POST
У меня есть простой метод входа, который возвращает 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, равно true. Но в этом случае я получаю ошибку.
Тогда я сделал этот метод. Проблема в том, что метод возвращает переменную success быстрее, чем был выполнен запрос POST. Так что это будет ложно в каждом случае. Я напечатал переменные, чтобы увидеть порядок выполнения кода, и метод сначала печатает "classOUT", возвращает переменную, а затем устанавливает значение переменной и печатает "classIN".
Как я могу дождаться выполнения кода, который регистрирует пользователя, чтобы я мог получить правильное значение переменной success?
2 ответа
Выполните вход пользователя, установив 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")
}
}