iPhone UIActivityIndi​​cator 直到进程完成后才会显示

标签 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 直到进程完成后才会显示。

有什么建议么?

最佳答案

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

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

要完成这项工作,您需要将方法任务推送到另一个线程。当工作完成时,该方法将回调此 View Controller ,以便可以更新 View 。我会在 willAnimateRotation... 中显示事件指示器方法。

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

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

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

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

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

关于iPhone UIActivityIndi​​cator 直到进程完成后才会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8688946/

相关文章:

ios - 解析.com : how to join 2 tables?

iphone - 使用 Swift 的 FMDatabaseQueue (FMDB)

ios - 使用 block 在现场创建代表

iphone - 在 iPhone 中截取条形图

objective-c - CoreData 模型更新崩溃

objective-c - 如何隐藏 NSTextFieldCell 的聚焦环?

ios - UITableView分组设置背景色透明

ios - 无法从 iMessage 应用程序访问相机

iphone - 如何在内存警告 viewDidUnload 后保留值

ios - 一些 unicode 箭头 (❯) 不显示