【发布时间】:2016-12-06 16:55:54
【问题描述】:
我正在开发我在 Firebase 中保存用户订阅数据的应用程序之一。每当用户开始使用我的应用程序并加载第一页时,我都想检索用户的订阅信息并想获取订阅到期日期。
现在,由于数据检索缓慢,我不明白,我怎么能等待它然后我的应用程序显示第一页。在viewWillAppear,我正在调用这个函数:
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,我也知道如何检查它是否为空或是否检索到任何信息。但它仍然是,问题是如何等待它然后加载页面。
【问题讨论】:
-
所以你问的是如何在后台线程中执行任务,然后在任务完成时调用完成块?
-
是的,因为我想在 viewDidLoad 中使用这些值。
-
基本上,工作流程是这样的:
viewDidLoad(main) -> 调用retrieveChildData(main) -> 更新 firebase 块内的userSubsData属性(背景)-> 更新 UI与userSubsData模型(主要)相关。viewDidLoad永远不要等到数据被检索到...所以 UI 更新应该在 firebase 完成回调中执行... -
我们在 viewDidLoad 或 viewWillAppear 中调用它是一样的,但我理解你的意思。我可以直接在 viewDidLoad 中调用 Firebase 完成块,而不是使用“retrieveChildData”方法并在后台线程中调用它。我认为,这个技巧会奏效。很快就会更新你。谢谢。
-
Firebase 完成块也在后台运行,如果我把它放在 viewDidLoad 中,它不会等待它完成。
标签: ios objective-c xcode firebase firebase-realtime-database