2014-12-07 75 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; 
} 

但问题是该方法在firebase查询运行之前终止并返回true。本质上,该方法执行,根据输入的密码检查占位符值,返回bool的值,并且仅仅检索密码(在块内)。我不知道如何强制该块同步运行,以便实际返回正确的布尔值。

是否有任何方法来改变方法的流程,以实际使它返回正确的布尔值?我很茫然。

非常感谢

PS:我知道,火力地堡支持专用的登录functionailty(为AuthUser和所有的);然而,这个项目更多的是一个概念证明,所以我们利用存储在主要Firebase中的简单的,未加密的密码。

回答