我正在设计一个使用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: 我知道Firebase支持专用的登录功能(AuthUser等等);但是,这个项目更像是一个概念证明,因此我们使用存储在主火力库中的简单,未加密的密码。
答案 0 :(得分:3)
要强制您的函数等待某些异步操作完成,请查看信号量。这是解决它的另一个StackOverflow问题:objective c - How do I wait for an asynchronously dispatched block to finish?