Обновить текст в сообщении с предупреждением - PullRequest
4 голосов
/ 23 февраля 2011

Все еще пытается обновить сообщение в UIAlertview, пока предупреждение активно.Я удалил большую часть первой части вопроса и опубликовал больше кода в обновлении ниже.

ОБНОВЛЕНИЕ 3: добавление кода!В .h файле я объявляю следующее (среди прочего):

@interface WebViewController : UIViewController <UIWebViewDelegate> {

IBOutlet UIWebView *webView;
UIAlertView *alert;

}

Я @property и @synthesize UIAlertview to.

Далее я создаю предупреждение в выполняемом IBActionпо нажатию кнопки:

-(IBAction)convert {

convertButton.enabled = NO;
mailButton.enabled = NO;
backButton.enabled = NO;

//show the alert window
alert = [[UIAlertView alloc] initWithTitle:@"Converting in progress\nPlease Wait..." message:@"\n\n\n" delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
[alert show];

UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

// Adjust the indicator so it is up a few pixels from the bottom of the alert
indicator.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 50);
[indicator startAnimating];
[alert addSubview:indicator];

[indicator release];

[alert setMessage:@"getting roster"];
}

Затем выполняется переход к следующей функции:

- (void)didPresentAlertView:(UIAlertView *)progressAlert {

   //A lot of code
      [alert setMessage:@"Checking history"];
   //more code
      [alert setMessage:@"writing history"];
   //even more code
      [alert setMessage:@"converting roster"];
}

Метод didPresentAlertView завершается запросом ASIHTTPRequest для публикации данных на веб-странице и по завершении этого запроса.наконец, код переходит к последнему методу для выхода из UIAlertView и закрывает все:

- (void)requestFinished:(ASIHTTPRequest *)request {

   [timer invalidate];
   [alert dismissWithClickedButtonIndex:0 animated:YES];
   backButton.enabled = YES;
   [alert release];
}

Я также удалил авто-релиз из моего инициализации UIAlertView, чтобы убедиться, что он существует во время остальной части процесса.

Как и сейчас, код запускает только самое первое setMessage -> «получение списка» и самое последнее -> «преобразование списка».Запросы setMessage посередине не запускаются ..

Действительно надеюсь, что кто-то может помочь мне здесь!

Спасибо всем!

1 Ответ

5 голосов
/ 24 февраля 2011

Теперь я вижу проблему.

Когда вы обновляете свойство message, оно сразу не перерисовывает представление. Представление помечается как «необходимое для рисования», а фактическое рисование происходит позже, обычно в конце текущего или следующего цикла выполнения в главном потоке.

Поэтому, пока ваш метод didPresentAlertView работает в главном потоке, представление предупреждений не перерисовывается, пока метод не завершится. Вот почему задача, требующая большого объема вычислений, должна выполняться в отдельном потоке, чтобы повысить скорость отклика пользовательского интерфейса, поскольку работа, связанная с пользовательским интерфейсом, выполняется в основном потоке.

Что вам нужно сделать, это запустить ваши //A lot of code //more code и //even more code в отдельном потоке и обновить свойство message в основном потоке.

Например, ваш код может выглядеть примерно так:

    // this is inside didPresentAlertView method
    NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
    [aQueue addOperationWithBlock: ^{
        // A lot of code
        [alert performSelector:@selector(setMessage:) onThread:[NSThread mainThread]
                       withObject:@"Checking history" waitUntilDone:NO];
        // more code
        [alert performSelector:@selector(setMessage:) onThread:[NSThread mainThread]
                       withObject:@"writing history" waitUntilDone:NO];
        // it goes on
    }];

Если вы работаете с iOS 4.0 и более поздними версиями и хотите использовать GDC, будьте осторожны, поскольку он может обнаружить независимость ваших вычислений и обновлений сообщений и позволить им происходить одновременно (что здесь нежелательно).

...