Использование UIAlertView в ожидании расчетов / обработки данных - PullRequest
2 голосов
/ 30 мая 2011

Я настроил свое приложение для iphone в макете вкладок и хотел бы выполнить довольно интенсивные вычисления (для получения результата может потребоваться несколько секунд), когда пользователь выбирает одну из вкладок.

Изначально казалось, что iphone будет зависать на исходной вкладке при выполнении вычисления номера.

Я попытался добавить UIAlertView в качестве некоторого приятного глазу, но у меня на несколько секунд появляется затухание до серого, затем после завершения вычислений происходит быстрое появление / исчезновение View. Я хочу видеть, что UIAlertView появляется / анимируется, когда пользователь касается вкладки, а затем исчезает, как только вычисления выполнены

- (void)viewDidAppear:(BOOL)animated
{    


    UIAlertView *baseAlert = [[[UIAlertView alloc] initWithTitle:@"Calculating" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil]autorelease];
    [baseAlert show];
    UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    aiv.center = CGPointMake(baseAlert.bounds.size.width /2.0f, baseAlert.bounds.size.height - 40.0f);
    [aiv startAnimating];
    [baseAlert addSubview:aiv];
    [aiv release];


/*** calculation and display routines***/


    [baseAlert dismissWithClickedButtonIndex:0 animated:YES];
}

Я уже видел этот пост , но я не могу понять, как применить его к моему делу.

Ответы [ 3 ]

6 голосов
/ 30 мая 2011

Самый простой способ решить это с помощью блоков;Сначала запланируйте вычисления для разделения потока с использованием первого блока, а когда закончите, отключите просмотр предупреждений через блок, отправленный в основной поток:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{

// Do calculations


dispatch_async(dispatch_get_main_queue(), ^
                       {
                          [baseAlert dismissWithClickedButtonIndex:0 animated:YES];
                       });
});
4 голосов
/ 30 мая 2011

Вы должны понимать, как работает цикл обработки событий.Когда вы вызываете [baseAlert show], представление оповещений добавляется в иерархию представлений, но на самом деле оно не отображается на экране, пока не закончится текущий блок кода и управление не вернется в цикл обработки событий.Выполняя свои вычисления сразу же после запроса представления оповещения, вы предотвращаете появление оповещения.

Это похоже на написание письма, в котором говорится, что вы планируете покрасить свой дом, потратив неделю на покраску своего домазатем написать еще одно письмо, в котором говорится, что вы это сделали, и THEN взять оба письма и отправить их в почтовый ящик для одновременной доставки.

Если у вас дорогие вычисления,Самый простой способ справиться с этим в iOS 4 и более поздних версиях - поместить блок кода в очередь отправки, чтобы работа выполнялась в фоновом потоке, а основной поток все еще мог обновлять экран и реагировать на нажатия пальцами.

 [baseAlert show];
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
     // we're on a secondary thread, do expensive computation here
     // when we're done, we schedule another block to run on the main thread
     dispatch_async(dispatch_get_main_queue(), ^{
         // this code is back on the main thread, where it's safe to mess with the GUI
         [baseAlert dismissWithClickedButtonIndex:0 animated:YES];
     });
 });
0 голосов
/ 30 мая 2011

Вероятно, происходит то, что "интенсивные вычисления", которые вы выполняете, выполняются в том же потоке, где вы вызываете UIAlertView.Установка делегата для UIAlertView установит это в отдельном потоке, чтобы вам не приходилось беспокоиться о конфликтах и ​​о том, будет ли UIAlertView отображаться перед вычислениями.

В качестве альтернативы использование UIAlertView является довольно тяжелымручной подход - возможно, вы могли бы использовать какой-то другой элемент интерфейса для индикации прогресса вместо того, чтобы сделать приложение бесполезным, пока вы обрабатываете некоторые цифры?

...