iOS – UIAlertView отклоняется раньше ожидаемого

У меня есть вид и, кроме всего прочего, кнопка на нем. Когда пользователь нажимает кнопку, выполняется следующий код:

- (IBAction) goToPhotoViewControllerView:(id) sender{

    alert = [[UIAlertView alloc] initWithTitle:@"Por favor, aguarde" message:@"Carregando imagens" 
                                  delegate:nil 
                         cancelButtonTitle:nil 
                         otherButtonTitles:nil];
    [alert show];

    if(alert != nil) {
        UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

        indicator.center = CGPointMake(alert.bounds.size.width/2, alert.bounds.size.height-45);
        [indicator startAnimating];
        [alert addSubview:indicator];
        [indicator release];
    }

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

    //Do a lot of stuff here

        PhotoViewController *photoViewControllerView = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];

        [iosDao selectComics];

        [photoViewControllerView startWithComic:[[iosDao.comics lastObject] idComic] numPanels:[[[iosDao.comics lastObject] panels] count]];
        photoViewControllerView.navigationItem.title = @"Comics";

        [iosDao release];
        [[self navigationController] pushViewController:photoViewControllerView animated:YES];

        [alert dismissWithClickedButtonIndex:0 animated:YES];
        [alert release];
    });
}

Что происходит, так это то, что большую часть времени выполняется весь асинхронный код, отклоняя предупреждающее сообщение. Однако после того, как предупреждающее сообщение будет отклонено, экран все еще остается замороженным примерно на 2 или 3 секунды, прежде чем он перейдет к следующему контроллеру представления (photoViewControllerView). Я понятия не имею, почему это происходит. Я хочу, чтобы предупреждающее сообщение оставалось активным столько, сколько необходимо. Любые идеи?

Заранее спасибо!


person Tiago_Brasil    schedule 16.08.2011    source источник


Ответы (2)


Так что мне кажется, что проблема в том, что PhotoViewController требует времени для загрузки (можете ли вы использовать инструменты для подтверждения?). Поскольку PhotoViewController является вашим собственным классом, вы можете иметь делегата, сделать контроллер основного представления (тот, который отклоняет UIAlert) делегатом экземпляра PhotoViewController и заставить PhotoViewController вызывать делегата, чтобы сообщить ему, когда он будет готов и/или видны, например, в конце

- (void)viewWillAppear:(BOOL)animated
person pho0    schedule 16.08.2011
comment
Хм, в этом есть смысл. Но позвольте мне спросить вас. Означает ли это, что PhotoViewController выделяется асинхронно? Я имею в виду, не должны ли последние две строки (те, что с предупреждением об отклонении и выпуске) быть достигнуты сразу ПОСЛЕ завершения загрузки PhotoViewController (после того, как этот последний находится в середине кода, задолго до отклонения предупреждения)? - person Tiago_Brasil; 17.08.2011
comment
Я попробовал то, что вы сказали, и он не использовал метод viewWillAppear. Что сводит меня с ума, так это то, что он достигает этой строки, отклоняет предупреждение (как и ожидалось), а затем, после этого, останавливает экран примерно на 3 или 4 секунды, прежде чем фактически перейти к представлению PhotoViewController. Я думал, что как только будет достигнута последняя строка представленияWillAppear, новое представление должно появиться СРАЗУ ПОСЛЕ этого. Но это не так. Предыдущий вид зависает примерно на 2-3 секунды перед перемещением. Кто-нибудь знает, почему? - person Tiago_Brasil; 17.08.2011

Вы должны просто представить представление предупреждения и назначить себя его делегатом, а затем, когда вы получите сообщение о том, что представление предупреждения отклонено (через alertView:didDismissWithButtonIndex: метод делегирования), выполните остальной код.

person Filip Radelic    schedule 16.08.2011
comment
Привет фичек. Спасибо за ответ. Что я хочу сделать, так это выполнить всю асинхронную часть ДО закрытия alertView. Я хочу, чтобы alertView оставался включенным столько времени, сколько необходимо для запуска асинхронного кода, и только после этого переключал viewControllers. - person Tiago_Brasil; 17.08.2011
comment
О, только что заметил, что в вашем представлении предупреждений нет кнопок, и вы хотите, чтобы оно закрывалось только программно. Это плохой способ сказать людям подождать. UIActivityIndicatorView и метка вполне подойдут. - person Filip Radelic; 17.08.2011