2015-12-06 1 views
-1

Привет, Я работаю над настройкой Parse PFLogInViewController, чтобы logInButton фактически функционировал как кнопка регистрации и входа в систему, сначала проверив, будет ли имя пользователя уже существовать. Если это не так, тогда пользователь будет создан. Если это произойдет, тогда пользователь войдет в систему. Я пытаюсь запустить этот запрос и проверить внутри функции shouldBeginLogInWithUsername, но я думаю, что у меня возникают проблемы из-за асинхронного запроса. Я пытался понять это часами, не повезло. Вот мой код:.Не удается получить Swift 2 и Parse асинхронный запрос для возврата boolean

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

Не возвращайте, вызов завершения блока – Wain

ответ

0

Поскольку вызов асинхронный, вы не можете ожидать, что сможете вернуть true или false непосредственно из вашей функции. Вам нужно передать закрытие функции, которая будет вызываться, когда операция async завершается. Вроде как это (это совершенно не проверялось, но, надеюсь, вы получите идею):

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 { 

    } 
}) 
+0

Hi @andlin благодарит за быстрый ответ! Я попытался реализовать код, который вы показали, но он не совсем понял результат, который я ищу. Извините, я очень новичок в Swift/Parse и, вероятно, плохо работал, объясняя, чего я пытаюсь выполнить. Если запрос вернется и не найдет пользователя, я хочу сохранить пользователя и вернуть false для функции logInViewController, чтобы он не пытался регистрировать их до их создания. Если запрос возвращается и находит пользователя, он должен возвращать true функции logInViewController, чтобы они вошли в систему. –

+0

глядя на код, который вы предоставили, я думаю, возможно, это имеет какое-то отношение к тому, как вы возвращаете функцию logInViewController Пустота. Я думаю, что мне нужно это, чтобы на самом деле быть Bool, который является либо истинным, либо ложным, исходя из того, проходит ли он через тест 'users.count == 0'. Кажется, я не могу понять, как структурировать это. Еще раз спасибо! –

+0

Вы получаете параметр bool, который вы ищете как параметр для закрытия обратного вызова. Затем вы проверяете значение параметра usernameExists и выполняете свой логин в закрытии. Вы хотите, чтобы я привел вам пример кода? – andlin