Почему мой UIAlertView появляется только после задержки? - PullRequest
2 голосов
/ 06 сентября 2011

В приведенном ниже примере кода 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 ]

10 голосов
/ 06 сентября 2011

Если «длинные инструкции по производительности» после кода предупреждения выполняются в главном потоке, они блокируют появление предупреждения. Прочитайте кое-что о циклах запуска Какао, это должно прояснить ситуацию. (По сути, можно сказать, что все инструкции пользовательского интерфейса в вашем методе не выполняются немедленно - они должны ждать завершения метода, а затем главный цикл выполнения выбирает их и выполняет.)

Код мог бы выглядеть так:

- (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 голос
/ 06 сентября 2011

Рассматривали ли вы возможность использования MBProgressHUD для длительных операций? Он будет заключать эти вызовы в отдельные потоки и будет очень гибким с точки зрения функциональности и пользовательского интерфейса

0 голосов
/ 03 августа 2014

Если вы показываете предупреждение в фоновом потоке, оно также будет иметь задержку.

0 голосов
/ 06 сентября 2011

Не думаю, что вам нужно звонить

  [progressAlert addSubview:progressView];

Кроме этого, он действительно должен просто появиться ...

...