2011-09-06 85 views
2

在下面UIAlertView示例代码延迟之后表演,但我需要马上显示出来为什么我的UIAlertView只会在延迟后出现?

//metoda zapisuje komentrz na serwerze 
-(void) saveAction { 

    UIAlertView *progressAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"imageGalleries.sendAction", @"") message:@" " delegate:self cancelButtonTitle:NSLocalizedString(@"alert.cancel", @"") otherButtonTitles:nil]; 

    [progressAlert addSubview:progressView]; 
    [progressAlert show]; 

    // some long performance instructions 
} 

- (void)loadView { 
    [super loadView]; 
    self.navigationItem.rightBarButtonItem = [NavButton buttonWithTitle:NSLocalizedString(@"sendImage.saveButtonTitle", @"") target:self action:@selector(saveAction)]; 
    progressView = [[UIProgressView alloc] initWithFrame: CGRectMake(30.0f, 80.0f - 26, 225.0f, 10.0f)]; 
} 

为什么UIAlertView不会立即显示当我打电话saveAction

回答

10

如果“长期业绩表现说明”下的报警代码运行主线程,他们会阻止出现的警报。阅读关于Cocoa运行循环的一些信息,这会让事情变得更加清晰。 (基本上可以这么说,你方法中的所有UI指令都不会立即执行 - 它们必须等待方法结束,然后主运行循环才会启动并运行它们。)

代码可能最好是这样的:

- (void) startSomeLongOperation { 
    [self createAndDisplayProgressSpinner]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{ 
     // …do something that takes long… 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self dismissProgressSpinner]; 
     }); 
    }); 
} 

这将长操作移动到后台,以便主线程可以继续立即执行。

+0

我的观点正是如此。在后台执行长时间的操作。通知UI的进展。警报将立即显示并且操作可以继续不受阻碍。 +1 –

0

我不认为你需要调用

[progressAlert addSubview:progressView]; 

除此之外,它真的应该只出现......

+0

它的工作原理,谢谢 –

1

您是否考虑过使用MBProgressHUD进行长期操作?它会将这些调用包装到单独的线程中,并且从功能和UI角度非常灵活

+0

这是更好的解决方案,但我必须用'UIAletView'处理 –

0

如果您在后台线程中显示警报,它也会有延迟。

+0

当我问这个问题时,我是初学者,现在我可以轻松解决这类问题,但感谢您的回答。 –

相关问题