Я разрабатываю приложение, которое использует firebase для хранения информации о пользователе. Ниже я пытаюсь написать метод, который запрашивает базу данных, получает сохраненный пароль и проверяет его на введенный пароль, возвращая логическое значение в зависимости от того, соответствуют ли они.Заставить асинхронный запрос Firebase выполнить синхронно?
-(BOOL) ValidateUser: (NSString*)username :(NSString*)password {
//initialize blockmutable true-false flag
__block bool loginFlag = true;
//initialize blockmutable password holder
__block NSString* passholder;
//check if user exists in database
//get ref to firebase
Firebase * ref = [[Firebase alloc] initWithUrl:kFirebaseURL];
//delve into users
Firebase * usersref = [ref childByAppendingPath:@"users"];
//search based on username
FQuery * queryRef = [[usersref queryOrderedByKey] queryEqualToValue: username];
//EXECUTION SKIPS THIS PORTION OF CODE
//get snapshot of things found
[queryRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *querySnapshot){
NSLog(@"%@", querySnapshot);
if no match found
if (querySnapshot.childrenCount == 0)
{
return false
loginFlag = false;
}
//otherwise store password of thing found
else
{
passholder = querySnapshot.value[@"hashed_password"];
NSLog(@"%@", passholder);
}
}];
//CODE SKIPS TO HERE
NSLog(@"%@", passholder);
//check inputted password against database password
if (![password isEqualToString:passholder])
{
//if they don't match, return false
loginFlag = false;
}
return loginFlag;
}
Проблема, однако, заключается в том, что метод завершается и возвращает true перед запуском запроса на базу. По сути, этот метод выполняется, проверяет значения закладок против введенного пароля, возвращает значение для bool, И ТОЛЬКО ТОГДА получает пароль (внутри блока). Я не уверен, как заставить блок работать синхронно, чтобы фактически вернуть правильное логическое значение.
Есть ли способ изменить поток метода, чтобы он действительно возвращал правильное логическое значение? Я в недоумении.
Большое спасибо
PS: Я знаю, что Firebase поддерживает специальный логин functionailty (AuthUser и все такое); однако этот проект является скорее доказательством концепции, поэтому мы используем простые, незашифрованные пароли, хранящиеся в основной базе.