我已经在标签布局中设置了我的iphone应用程序,当用户选择其中一个标签时,我想执行一些相当激烈的计算(可能需要几秒钟才能得到结果)。
最初,看起来iphone会在进行数字运算时挂在原始标签上。
我尝试添加一个UIAlertView作为一些令人眼花缭乱的东西,但是我渐渐变灰了几秒钟,然后在计算完成后,View快速出现/消失。我想看到的是当用户触摸标签时UIAlertView显示/动画,然后在计算完成后消失
- (void)viewDidAppear:(BOOL)animated
{
UIAlertView *baseAlert = [[[UIAlertView alloc] initWithTitle:@"Calculating" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil]autorelease];
[baseAlert show];
UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
aiv.center = CGPointMake(baseAlert.bounds.size.width /2.0f, baseAlert.bounds.size.height - 40.0f);
[aiv startAnimating];
[baseAlert addSubview:aiv];
[aiv release];
/*** calculation and display routines***/
[baseAlert dismissWithClickedButtonIndex:0 animated:YES];
}
我已经看过this post,但我似乎无法弄清楚如何将它应用到我的案例中。
答案 0 :(得分:6)
解决这个问题的最简单方法是使用块;首先计划使用第一个块来分离线程,并在完成时通过主线程上调度的块解除警报视图:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
// Do calculations
dispatch_async(dispatch_get_main_queue(), ^
{
[baseAlert dismissWithClickedButtonIndex:0 animated:YES];
});
});
答案 1 :(得分:4)
您需要了解事件循环的工作原理。当您调用[baseAlert show]
时,警报视图将添加到视图层次结构中,但在当前代码块结束并且控件返回到事件循环之前,它实际上并未绘制到屏幕。通过在询问警报视图显示后立即进行计算,您将阻止警报出现。
这有点像写一封信告诉某人你打算画你的房子,花一周时间画你的房子,然后写另一封信说你已经完成了,然后然后同时收到两封信和将它们放在邮箱中同时送达。
如果你有一个昂贵的计算,在iOS 4及更高版本中处理它的最简单方法是在调度队列中放置一段代码,所以工作将在后台线程中完成,主线程仍然可以更新屏幕并响应手指点击。
[baseAlert show];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
// we're on a secondary thread, do expensive computation here
// when we're done, we schedule another block to run on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
// this code is back on the main thread, where it's safe to mess with the GUI
[baseAlert dismissWithClickedButtonIndex:0 animated:YES];
});
});
答案 2 :(得分:0)
可能发生的事情是,您正在进行的“强烈计算”正在您调用UIAlertView的同一个线程中运行。为UIAlertView设置委托会在单独的线程中设置它,这样您就不必担心争用以及UIAlertView是否会在计算之前显示出来。
或者,使用UIAlertView是一种相当沉重的方法 - 也许您可以使用其他一些界面元素来指示进度,而不是在您处理某些数字时使应用程序无用?