为什么我的UIAlertView只会在延迟后出现?

时间:2011-09-06 17:37:53

标签: iphone cocoa-touch 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没有立即显示?

4 个答案:

答案 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)

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