立即显示子视图/等待视图可见,然后再继续

时间:2012-08-28 18:53:33

标签: ios

我有一个启动到标签栏控制器的应用程序。当应用程序启动或从后台返回时,它会检查服务器是否有对其数据的更新。如果有可用更新,则可能需要几秒钟才能获取数据并进行更新。

我想简单地提供一个叠加视图,告诉用户应用程序的数据正在更新,请等待几秒钟。我试图这样做的方式如下:在我的课程中,我负责更新:

AppDelegate *delegate = [UIApplication sharedApplication].delegate;
[delegate.tabBarController.selectedViewController.view addSubview:updatingDataView];
[self runUpdateMethods];

问题是只有在更新方法完成后,updatesDataView才会出现在屏幕上。如何在更新方法开始之前让它出现?

3 个答案:

答案 0 :(得分:6)

看起来你在主线程上运行[self runUpdateMethods];(这将阻止你的UI更新)。您可能希望在后台线程上运行它。类似的东西:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
               ^{
                   [self runUpdateMethods];
               });

[self performSelectorInBackground:@selector(runUpdateMethods) withObject:nil];

<强>更新

由于您希望在[self runUpdateMethods];完成后执行某些操作,因此您需要执行以下操作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), 
^{
    [self runUpdateMethods];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self doSomethingAfterUpdate];
    });    
});

这样做仍然可以让您知道runUpdateMethods何时返回并且不会挂起用户界面。

答案 1 :(得分:2)

您的更新方法(连接)可能正在主线程上执行,阻止UI更新。您应该使用异步方法(gcd,NSThread,NSOperationQueue等)来运行更新。

答案 2 :(得分:1)

您需要清空您的运行循环,以便您添加的视图将在屏幕上绘制。借助iOs并不是实时的。你基本上设置你的绘图并退出你的方法,并且运行循环实际上绘制它。因此,您需要做的是延迟runUpdateMethods的执行,直到您退出例行程序。请尝试改为:

[self performSelector:@selector(runUpdateMethods) withObject:nil afterDelay:0.0];