Ios 等待从Firebase Objective-C下载数据
我正在开发一个应用程序,其中我正在Firebase中保存用户订阅数据。每当用户开始使用我的应用程序并加载第一个页面时,我都希望检索用户的订阅信息并获取订阅到期日期 现在,由于检索数据的速度很慢,我不明白,我如何才能等待它,然后我的应用程序显示第一页。在Ios 等待从Firebase Objective-C下载数据,ios,objective-c,xcode,firebase,firebase-realtime-database,Ios,Objective C,Xcode,Firebase,Firebase Realtime Database,我正在开发一个应用程序,其中我正在Firebase中保存用户订阅数据。每当用户开始使用我的应用程序并加载第一个页面时,我都希望检索用户的订阅信息并获取订阅到期日期 现在,由于检索数据的速度很慢,我不明白,我如何才能等待它,然后我的应用程序显示第一页。在视图中将出现,我调用此函数: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self retrieveC
视图中将出现,我调用此函数:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self retrieveChildData];
});
//Here I also tried to call it on main thread.
//[self performSelectorOnMainThread:@selector(retrieveChildData) withObject:nil waitUntilDone:YES];
-(void)retrieveChildData
{
NSString *strUrl = [NSString stringWithFormat:@"https://Address.."];
FIRDatabaseReference *ref = [[FIRDatabase database] referenceFromURL:strUrl];
[ref observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
for ( FIRDataSnapshot *child in snapshot.children) {
userSubsData = child.value; //or craft an object instead of dict
}
}];
}
userSubsData
是NSDictionary,我还知道如何检查它是否为空或是否检索到任何信息。但问题仍然是如何等待它,然后加载页面。一个非常简单的技巧适用于NSTimer。我刚刚在viewDidLoad中调用了计时器函数
statusTimer = [NSTimer scheduledTimerWithTimeInterval:0.0f
target:self selector:@selector(checkStatus:) userInfo:nil repeats:YES];
在checkStatus中,我检查是否检索到数据,然后使计时器无效
-(void)checkStatus:(NSTimer*)timer
{
NSLog(@"Timer started");
if([userSubsInfo count] != 0)
{
NSLog(@"Subscription data retrived");
[statusTimer invalidate];
statusTimer = nil;
}
}
因此,您询问如何在后台线程中执行任务,然后在任务完成时调用完成块?是的,因为我想在viewDidLoad中使用这些值。基本上,工作流是这样的:viewDidLoad
(main)->callRetrieveChildata
(main)->更新firebase块内的userSubsData
属性(背景)->更新与userSubsData
model(主)相关的UIviewDidLoad
不应等到检索到数据后再加载。。。因此,UI更新应该在firebase完成回调中执行……我们在viewDidLoad中调用它或ViewWillDisplay中调用它都是一样的,但我理解你的观点。我可以直接在viewDidLoad中调用Firebase完成块,而不是使用“RetrieveChildata”方法并在后台线程中调用它。我想,这个把戏会奏效的。我们将很快向您提供最新信息。谢谢。Firebase完成块也在后台运行,如果我把它放在viewDidLoad中,它不会等待它完成。