在等待计算/处理数据时使用UIAlertView

时间:2011-05-29 20:49:42

标签: iphone uialertview

我已经在标签布局中设置了我的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,但我似乎无法弄清楚如何将它应用到我的案例中。

3 个答案:

答案 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是一种相当沉重的方法 - 也许您可以使用其他一些界面元素来指示进度,而不是在您处理某些数字时使应用程序无用?