【问题标题】:Wait until data is downloaded from Firebase Objective-C等到从 Firebase Objective-C 下载数据
【发布时间】: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


【解决方案1】:

一个非常简单的技巧适用于 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;

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    相关资源
    最近更新 更多