Проблемы с получением 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 {

   }
})
Другие вопросы по тегам