2014-12-07 2 views
0

Я разрабатываю приложение, которое использует 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 и все такое); однако этот проект является скорее доказательством концепции, поэтому мы используем простые, незашифрованные пароли, хранящиеся в основной базе.

ответ

Смежные вопросы