Проблемы с получением Swift 2 и Parse асинхронного запроса для возврата логического значения
Привет, я работаю над настройкой Parse PFLogInViewController, чтобы logInButton фактически функционировал как кнопка регистрации и входа, сначала проверив, существует ли имя пользователя. Если это не так, то пользователь будет создан. Если это произойдет, то пользователь войдет в систему. Я пытаюсь выполнить этот запрос и проверить его в функции shouldBeginLogInWithUsername, но думаю, что возникли проблемы из-за асинхронного запроса. Я пытался понять это часами без удачи. Вот мой код:
func logInViewController(logInController: PFLogInViewController, shouldBeginLogInWithUsername username: String, password: String) -> Bool {
var bool = false
var query = PFUser.query()
query!.whereKey("username", equalTo: username)
query?.findObjectsInBackgroundWithBlock({ (users, error) -> Void in
if let users = users {
if users.count == 0 {
var user = PFUser()
user.username = username
user.password = password
user.signUpInBackground()
} else {
return bool = true
}
} else {
return bool = true
}
})
return bool
}
Как видите, мне нужно, чтобы моя логическая переменная bool сменила значение с ложного на истинное, если имя пользователя существует, и пользователь должен войти в систему. Я просто не могу понять, как обойти асинхронный запрос.
Любая помощь приветствуется!
1 ответ
Поскольку вызов асинхронный, вы не можете ожидать, что сможете вернуть true или false непосредственно из вашей функции. Вам нужно передать замыкание в функцию, которая будет вызываться после завершения асинхронной операции. Вроде как (это полностью не проверено, но, надеюсь, вы поняли):
func logInViewController(logInController: PFLogInViewController, shouldBeginLogInWithUsername username: String, password: String, callback: (usernameExists : Bool) -> Void) -> Void {
var query = PFUser.query()
query!.whereKey("username", equalTo: username)
query?.findObjectsInBackgroundWithBlock({ (users, error) -> Void in
if let users = users {
if users.count == 0 {
var user = PFUser()
user.username = username
user.password = password
user.signUp()
callback(usernameExists: false)
} else {
callback(usernameExists: true)
}
} else {
callback(usernameExists: false)
}
})
}
Используйте это так, вроде:
logInViewController(viewController, shouldBeginLogInWithUsername: "", password: "", callback: { (usernameExists) -> Void in
//Do your login logic here
if (usernameExists) {
} else {
}
})