我有一个启动到标签栏控制器的应用程序。当应用程序启动或从后台返回时,它会检查服务器是否有对其数据的更新。如果有可用更新,则可能需要几秒钟才能获取数据并进行更新。
我想简单地提供一个叠加视图,告诉用户应用程序的数据正在更新,请等待几秒钟。我试图这样做的方式如下:在我的课程中,我负责更新:
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
[delegate.tabBarController.selectedViewController.view addSubview:updatingDataView];
[self runUpdateMethods];
问题是只有在更新方法完成后,updatesDataView才会出现在屏幕上。如何在更新方法开始之前让它出现?
答案 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];