UIAlertView отклонить в потоке, когда основной поток заблокирован в IOS - PullRequest
0 голосов
/ 16 января 2012

У меня есть приложение, которое ожидает подключения.В то время как приложение ожидает, мне нужно показать AlertView пользователю, который должен через какое-то время либо закрыть программным способом, либо нажатием на кнопку отмены AlertView.

Основной поток ожидает подключения клиента, где какв другом потоке я создаю и показываю AlertView, который обновляет время в диалоге.В потоке есть NSRunLoop, который обновляет текст в AlertView.

Все работает нормально, за исключением того, что AlertView не получает сенсорные события и даже не обрабатывается программно.Может ли кто-нибудь пролить свет на то, что я могу делать здесь неправильно.

Вот пример кода.

funcA() {

    [NSThread detachNewThreadSelector:@selector(createDialog) toTarget:self withObject:nil];

    [NSThread detachNewThreadSelector:@selector(updateDialog) toTarget:self withObject:nil];

    ..

    ..

    BlockingWait();

    ..

    ..

}

- (void) createDialog {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    alert = [[UIAlertView alloc] initWithTitle:@"Wait" message:@"\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];

    ...

    label = [[UILabel alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 225.0f, 90.f)];

    [alert show];

    [alert release];

    [pool drain];

}

- (void) upDateDialog {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSRunLoop *loop = [NSRunLoop currentRunLoop];

    timer =  [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateText) userInfo:nil repeats:YES];

    [loop run];

    [pool drain];
}

- (void) updateText {

    label.text = " Wait for" + n +  "secs";

    n--;

    if ( n == 0 )
      [alert dismissWithClickedButtonIndex:0 animated:YES];  // Doesn't work
}


- (void) alertView: (UIAlertView *) alert clickedButtonAtIndex:(NSInteger) buttonIndex {
// Never Gets called
    NSLog(@"Alert is dissmissed with button index %d", buttonIndex);

    if (buttonIndex == 0) {

        [timer invalidate];
    }
}

Ответы [ 2 ]

2 голосов
/ 16 января 2012

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

0 голосов
/ 16 января 2012

Никогда не блокируйте основной поток.Никогда не.Создайте UIAlertView в асинхронном режиме, удерживайте его в ivar, пока вы выполняете другую работу, и обновляйте его по мере необходимости.Маловероятно, что вам понадобятся какие-либо темы или блокировки для этого вообще.Просто используйте NSURLConnection асинхронно для управления соединением без блокировки.

...