0

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

我想简单地呈现一个覆盖视图,告诉用户应用程序的数据正在更新,请等待几秒钟。我尝试执行此操作的方式如下:在我负责更新的班级中:

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

问题是 updateDataView 仅在更新方法完成后才会出现在屏幕上。我怎样才能让它在更新方法开始之前出现?

4

3 回答 3

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返回并且不会挂起 UI。

于 2012-08-28T18:57:26.317 回答
2

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

于 2012-08-28T18:58:17.913 回答
1

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

[self performSelector:@selector(runUpdateMethods) withObject:nil afterDelay:0.0];
于 2012-08-28T18:59:46.220 回答