IPhone UIActivityIndi​​cator将在流程完成后才会显示

时间:2011-12-31 15:34:31

标签: iphone objective-c ios process uiactivityindicatorview

我已经研究了几天,但我找不到任何工作。

这是所需的过程:用户按下弹出窗口中的输入按钮 - > ActivityIdicator出现 - >保存过程发生 - > ActivityIndi​​cator消失了。

但是,由于某种原因,ActivityIndi​​cator直到完成该过程后才会显示,因此它完全没用。

我尝试按照此处描述的流程进行操作:UIActivityIndicator not working properly?

以下是弹出窗口的代码

-(void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the Enter/Cancel buttons
    [self performSelector:@selector(DisplaySpinner) withObject:nil afterDelay:0];
    if (buttonIndex == 1)
    {
        [self performSelector:@selector(EnterButtonClicked) withObject:nil afterDelay:0];
    }
    else
    {
        NSLog(@"Name Cancel Clicked");
    }
    [NameField resignFirstResponder];
    }

以下是DisplaySpinner方法的代码:

-(void)DisplaySpinner{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

    [self.view addSubview:loadingIndicator];
    [loadingIndicator startAnimating];

    [pool release];
}

EnterButtonClicked方法包含保存过程。尽管在单独的进程中运行,但ActivityIndi​​cator在进程完成之后才会显示。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

在主要运行循环重新获得控制权之前,应用程序不会更新屏幕以显示UIActivityIndicatorView。如果您的处理任务阻止主线程,则在完成之前将不进行UI更新。你应该异步进行处理。

当旋转事件发生时,willRotate...willAnimateRotation...方法在一次通过主运行循环时被调用。因此,在显示活动指示符之前阻止该方法。

要使其工作,您需要将方法任务推送到另一个线程。当工作完成时,该方法将回调此视图控制器,以便可以更新视图。我会在willAnimateRotation...方法中显示活动指标。

您需要做的是强制UIActivityIndicatorView开始显示,即使运行循环不会结束。一种方法是 -

[self performSelector:@selector(animation) withObject:nil afterDelay:0]

-(void)startSpinner
{
    NSAutoreleasepool *pool = [[NSAutorepleasepool alloc]init];
    [indicatorView startAnimating];
    [pool release];
}

基本上,performSelector设置一个计时器来在当前线程的运行循环上执行animation消息。计时器配置为以默认模式(NSDefaultRunLoopMode)运行。当计时器触发时,线程会尝试将消息从运行循环中出列并执行选择器。如果运行循环正在运行且处于默认模式,它会成功;否则,计时器将等待,直到运行循环处于默认模式。

请注意,指定延迟0并不一定会导致选择器立即执行。选择器仍然在线程的运行循环中排队,并尽快执行。