2017-02-08 12 views
1

У меня есть следующий запрос Firebase, где я проверяю, существует ли имя пользователя в базе данных. Я хотел бы присвоить логическое значение (true) переменной, называемой usernameAlreadyExists. Однако мне нужно получить доступ к этой переменной с ее новым значением за пределами закрытия. Я прочитал, что для этого мне нужно реализовать checkHandler или обратный вызов. Тем не менее, я не знаю, как реализовать это в Firebase синтаксиса запросов:Доступ к переменной в закрытии Firebase

var usernameAlreadyExists = false 

FIRDatabase.database().reference().child("usernames").queryOrderedByValue().queryEqual(toValue: self.username.text).queryLimited(toFirst: 1).observe(.childAdded, with: { snapshot in 

     // Username unavailable, chose another one 
     self.invalidUsernameMsg.text = "This username already exists, please choose another one." 
     print(snapshot) 
     print(snapshot.value) 
     usernameAlreadyExists = true 

}) 

print(usernameAlreadyExists) 

печати (usernameAlreadyExists) -> Я хочу, чтобы эта строка для печати «истинный», но он печатает «ложь», потому что приведенный выше код выполняется асинхронно.

Любая помощь более чем приветствуется. Спасибо!

ответ

1

Вы видите значение false при печати переменной userNameAlreadyExists, потому что вы правы. Программа будет работать через ваш код очень быстро, включая печать, а затем, когда Firebase завершит свой запрос, он добавит изменение значения вашего userNameAlreadyExists в true.

Это ясно?

Кроме того, для обработчика вызова или завершения вы уже имеете это в своем коде Firebase. Часть snapshot in - это начало вашего обработчика завершения.

Если вы хотите напечатать переменную так, а затем положить его в обработчик завершения, например, так:

var usernameAlreadyExists = false 

FIRDatabase.database().reference().child("usernames").queryOrderedByValue().queryEqual(toValue: self.username.text).queryLimited(toFirst: 1).observe(.childAdded, with: { snapshot in 

     // Username unavailable, chose another one 
     self.invalidUsernameMsg.text = "This username already exists, please choose another one." 
     print(snapshot) 
     print(snapshot.value) 
     usernameAlreadyExists = true 
     print(usernameAlreadyExists) 
}) 

EDIT: OP хочет, чтобы проверить имя пользователя, если существующий или не до регистрации.

  1. Detect, когда пользователь прекращает печатать внутри имя пользователя TextField Ссылка: https://stackoverflow.com/a/29763089/3231194

  2. Внутри функции обнаружения выше, поместите Firebase функцию, которую вы используете размещены в вашем вопросе, как и :

    func userDidStopTypingUsername() { 
        // Firebase query here. 
        // Then if existing, do something and store the value too in your bool variable. 
    } 
    
  3. Кроме того, внутри IBAction или функции кнопке Signup, проверить userNameAlreadyExists тоже. Если они существуют, то сделайте что-нибудь и вернитесь, чтобы не допустить регистрации. В противном случае продолжайте.

+0

Большое спасибо за объяснение prettyitgirl.com! Однако мне нужно будет получить доступ к этой переменной за пределами закрытия. Я представил это ** print() ** в текущем примере, чтобы отразить поведение, которое должен иметь код. Но позже мне нужно будет использовать измененное значение (от false до true) переменной в моем коде. Мне нужно будет запустить некоторый код в зависимости от значения переменной следующим образом: ** если usernameAlreadyExists {// Сделать что-то} else {// Сделать что-то еще} **. Есть ли способ сделать это? Еще раз спасибо! – ayarem502

+0

Привет, я предполагаю, что вы выполняете эту проверку 'usernames' для вашей ** подписки **, правильно? Или вы хотите подтвердить правильность имени пользователя, как только пользователь закончит или перестанет печатать текст в текстовом поле? – Glenn

+0

Это правильно. Я хочу проверить имя пользователя до того, как пользователь зарегистрируется. Идея состоит в том, что пользовательская информация будет записана в базу данных в конце процесса регистрации. Таким образом, если пользователь убивает приложение в середине процесса регистрации, данные не будут записаны в БД.Приведенный выше код позволяет мне определить, было ли уже введено имя пользователя в режиме реального времени. Тем не менее, мне нужен способ проверить, не было ли имя пользователя не принято, и насколько я знаю, вы не можете сделать это с помощью запроса Firebase, поэтому я хочу получить результат запроса выше и использовать его в качестве ссылки , – ayarem502