Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 等待从Firebase Objective-C下载数据_Ios_Objective C_Xcode_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 等待从Firebase Objective-C下载数据

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

我正在开发一个应用程序,其中我正在Firebase中保存用户订阅数据。每当用户开始使用我的应用程序并加载第一个页面时,我都希望检索用户的订阅信息并获取订阅到期日期

现在,由于检索数据的速度很慢,我不明白,我如何才能等待它,然后我的应用程序显示第一页。在
视图中将出现
,我调用此函数:

    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)->call
RetrieveChildata
(main)->更新firebase块内的
userSubsData
属性(背景)->更新与
userSubsData
model(主)相关的UI
viewDidLoad
不应等到检索到数据后再加载。。。因此,UI更新应该在firebase完成回调中执行……我们在viewDidLoad中调用它或ViewWillDisplay中调用它都是一样的,但我理解你的观点。我可以直接在viewDidLoad中调用Firebase完成块,而不是使用“RetrieveChildata”方法并在后台线程中调用它。我想,这个把戏会奏效的。我们将很快向您提供最新信息。谢谢。Firebase完成块也在后台运行,如果我把它放在viewDidLoad中,它不会等待它完成。