下面的示例代码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
没有立即显示?
答案 0 :(得分: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];
});
});
}
这会将长操作移到后台,以便主线程可以立即继续执行。
答案 1 :(得分:1)
您是否考虑过使用MBProgressHUD进行长期操作?它会将这些调用封装到单独的线程中,并且从功能和UI角度来看非常灵活
答案 2 :(得分:0)
我认为你不需要打电话
[progressAlert addSubview:progressView];
除此之外,它真的应该出现......
答案 3 :(得分:0)
如果您在后台线程中显示警报,它也会有延迟。